Http 407 требуется прокси-аутентификация: как обрабатывать код Java
System.setProperty("http.proxySet", "true");
System.setProperty("java.net.useSystemProxies", "true");
System.setProperty("http.proxyHost", "192.168.1.103");
System.setProperty("http.proxyPort", "3128");
System.setProperty("http.proxyUser", "user123");
System.setProperty("http.proxyPassword", "passwD123");
url = new URL("http://www.google.co.in");
каждый раз, когда я использую этот код IOException, который указывает HTTP-код ответа 407.
HTTP 407 означает аутентификацию прокси-сервера. почему эта проблема возникает, когда я устанавливаю proxyUser и proxyPassword.
![enter image description here]()
http 401 произойдет, если я поставлю неверный пароль, но он всегда дает мне 407, значит, мой код не принимает имя пользователя и пароль. В приведенном выше коде user123 является именем пользователя, а passwD123 является паролем для проверки подлинности прокси.
Ответы
Ответ 1
http://blog.vinodsingh.com/2008/05/proxy-authentication-in-java.html
Я нашел решение благодаря г-ну Виноду Сингху.
Аутентификация прокси-сервера в Java
Обычные корпоративные сети обеспечивают доступ в Интернет через прокси-серверы, а иногда требуют аутентификации. May приложения открывают подключения к серверам, которые являются внешними по отношению к корпоративной интрасети. Таким образом, необходимо прокси-аутентификацию программно. К счастью, Java обеспечивает прозрачный механизм для аутентификации прокси.
Создайте простой класс, как показано ниже -
import java.net.Authenticator;
class ProxyAuthenticator extends Authenticator {
private String user, password;
public ProxyAuthenticator(String user, String password) {
this.user = user;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password.toCharArray());
}
}
и поместите эти строки кода, прежде чем ваш код откроет URLConnection -
Authenticator.setDefault(new ProxyAuthenticator("user", "password"));
System.setProperty("http.proxyHost", "proxy host");
System.setProperty("http.proxyPort", "port");
Теперь все вызовы успешно пройдут проверку подлинности прокси.
Ответ 2
@GauravDS
Вы упомянули:
http://blog.vinodsingh.com/2008/05/proxy-authentication-in-java.html
Я нашел решение благодаря г-ну Виноду Сингху.
Аутентификация прокси-сервера в Java
Обычные корпоративные сети обеспечивают доступ в Интернет через прокси-серверы, а иногда требуют аутентификации. May приложения открывают подключения к серверам, которые являются внешними по отношению к корпоративной интрасети. Таким образом, необходимо прокси-аутентификацию программно. К счастью, Java обеспечивает прозрачный механизм для аутентификации прокси.
Создайте простой класс,
.
.
.
и поместите эти строки кода, прежде чем ваш код откроет URLConnection-
Authenticator.setDefault(new ProxyAuthenticator("user", "password"));
System.setProperty("http.proxyHost", "proxy host");
System.setProperty("http.proxyPort", "port");
Теперь все вызовы успешно пройдут через прокси-аутентификацию.
Что делать, если для сайта, к которому вы подключаетесь, также требуется имя пользователя/пароль.
Установка аутентификатора по умолчанию (Authenticator.setDefault) завершится неудачно, я думаю, когда внешний сайт будет искать аутентифицированного пользователя.
Любые взгляды?.... Кто-то?
Edit: 1
Раньше использовался этот код и получал ошибку (407). Требуется прокси-аутентификация.
Я считаю, что это связано с тем, что аутентификация запрашивалась разными хостами. и когда вы устанавливаете аутентификатор по умолчанию с одним пользователем/паролем для одного хоста, тогда аутентификация не будет выполнена для другого запрашивающего узла. Вчера я сделал следующее изменение в классе SimpleAuthenticator, и теперь он работает как шарм.
protected PasswordAuthentication getPasswordAuthentication()
{
String requestingHost = getRequestingHost();
if (requestingHost == proxyHost){
System.out.println("getPasswordAuthentication() request recieved from->" + requestingHost );
return new PasswordAuthentication(proxyuser,proxypass.toCharArray());
}
else{
System.out.println("getPasswordAuthentication() request recieved from->" + requestingHost );
return new PasswordAuthentication(sharepointusername,sharepointpassword.toCharArray());
}
}
Дополнительная информация здесь: http://blog.ashwani.co.in/blog/2013-07-29/access-sharepoint-webservices-from-java-behind-proxy/
Ответ 3
Ответ на использование Authenticator
правильный для общего случая. Однако другая причина HTTP 407 в Java 8u111, а позже - если вы используете аутентификацию BASIC против прокси.
В этом случае добавьте это системное свойство:
-Djdk.http.auth.tunneling.disabledSchemes=
Я нашел это из: https://confluence.atlassian.com/kb/basic-authentication-fails-for-outgoing-proxy-in-java-8u111-909643110.html