Подтвердить что ты не робот

Сервер вернул код ответа HTTP: 401 для URL: https

Я использую Java для доступа к сайту HTTPS, который возвращает отображение в формате XML. Я передаю учетные данные для входа в самом URL-адресе. Вот фрагмент кода:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
requestURL = "https://Administrator:[email protected]:8443/abcd";

try { 
        InputStream is = null;
        URL url = new URL(requestURL);
        InputStream xmlInputStream =new URL(requestURL).openConnection().getInputStream();
        byte[] testByteArr = new byte[xmlInputStream.available()];
        xmlInputStream.read(testByteArr);
        System.out.println(new String(testByteArr));
        Document doc = db.parse(xmlInputStream);
        System.out.println("DOC="+doc);
    } catch (MalformedURLException e) {
    } 

Я создаю доверительный менеджер в программе, который не проверяет подписанные/неподписанные сертификаты. Но при запуске вышеуказанной программы я получаю ошибку Сервер вернул код ответа HTTP: 401 для URL: https://Administrator:[email protected]:8443/abcd

Я могу использовать тот же URL-адрес в моем браузере, и он правильно отображает xml. Пожалуйста, дайте мне знать, как сделать эту работу в рамках программы Java.

4b9b3361

Ответ 1

401 означает "Несанкционированный", поэтому должно быть что-то с вашими учетными данными.

Я думаю, что java URL не поддерживает синтаксис, который вы показываете. Вместо этого вы можете использовать Authenticator.

Authenticator.setDefault(new Authenticator() {

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {          
        return new PasswordAuthentication(login, password.toCharArray());
    }
});

а затем просто вызовите обычный URL-адрес без учетных данных.

Другой вариант - предоставить учетные данные в заголовке:

String loginPassword = login+ ":" + password;
String encoded = new sun.misc.BASE64Encoder().encode (loginPassword.getBytes());
URLConnection conn = url.openConnection();
conn.setRequestProperty ("Authorization", "Basic " + encoded);

PS: Не рекомендуется использовать этот Base64Encoder, но это только для быстрого решения. Если вы хотите сохранить это решение, найдите библиотеку. Их много.

Ответ 2

Попробуйте это. Вам необходимо пройти аутентификацию, чтобы сервер знал своего действительного пользователя. Вам нужно импортировать эти два пакета и включить в себя jersy jar. Если вы не хотите включать jersy jar, то импортируйте этот пакет

import sun.misc.BASE64Encoder;

import com.sun.jersey.core.util.Base64;
import sun.net.www.protocol.http.HttpURLConnection;

а затем

String encodedAuthorizedUser = getAuthantication("username", "password");
 URL url = new URL("Your Valid Jira URL");
 HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
 httpCon.setRequestProperty ("Authorization", "Basic " + encodedAuthorizedUser );

 public String getAuthantication(String username, String password) {
   String auth = new String(Base64.encode(username + ":" + password));
   return auth;
 }