Сервер вернул код ответа 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.
Ответы
Ответ 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;
}