требуется аутентификация прокси-сервера 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-пароль для аутентификации прокси.

3 ответов


http://blog.vinodsingh.com/2008/05/proxy-authentication-in-java.html

Я нашел решение благодаря г-ну Виноду Сингху.

аутентификация прокси в Java

обычные корпоративные сети доступ в интернет через прокси-серверы и порой они требуют проверки. Могут ли приложения открывать подключения к серверам, которые являются внешними для корпоративной интрасети. Таким образом, нужно сделать аутентификацию прокси программно. К счастью, 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");

теперь все вызовы будут успешно пройти проверку подлинности прокси-сервера.


@GauravDS Вы упомянули:

http://blog.vinodsingh.com/2008/05/proxy-authentication-in-java.html Я нашел решение благодаря Мистеру Виноду Сингху. Аутентификация прокси в Java Обычные корпоративные сети предоставляют доступ в интернет через прокси-серверы, а иногда и требуют аутентификации. Могут ли приложения открывать подключения к серверам, которые являются внешними для корпоративной интрасети. Таким образом, нужно сделать аутентификацию прокси программно. К счастью Java предоставляет прозрачный механизм для проверки подлинности прокси-сервера. Создать простой класс, как показано ниже- .
.
.
и поместите эти строки кода, прежде чем ваш код откроет URLConnection- Authenticator.setDefault(new ProxyAuthenticator("user", "password")); System.setProperty("http.proxyHost", "proxy host"); System.setProperty("http.proxyPort", "port"); Теперь все вызовы будут успешно проходить через прокси-аутентификацию.

Что делать, если сайт, к которому вы подключаетесь, также требует имени пользователя / пароля, чтобы позволить вам. Установка средства проверки подлинности по умолчанию (Authenticator.setDefault) потерпит неудачу, я думаю, когда внешний сайт будет выглядеть для аутентифицированного пользователя.

какие мнения?....Кто-то ?

Edit: 1 Использовал этот код ранее и получал требуемую проверку подлинности прокси-сервера error (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/


ответ на использование Authenticator верно для общего случая. Однако другая причина HTTP 407 в Java 8u111 и позже, если вы используете базовую аутентификацию против прокси-сервера.

в этом случае добавьте это системное свойство:

-Djdk.http.auth.tunneling.disabledSchemes=

я узнал это из: https://confluence.atlassian.com/kb/basic-authentication-fails-for-outgoing-proxy-in-java-8u111-909643110.html