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