Аутентификация прокси-сервера HttpUrlConnection попадает в цикл перенаправления

Я пытаюсь получить содержимое URL-адреса через аутентифицированный прокси-сервер. Это код, который я пытаюсь использовать:

        Authenticator authenticator = new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                System.out.println("authenticating");
                return (new PasswordAuthentication("username", "password".toCharArray()));
            }
        };
        Authenticator.setDefault(authenticator);
        URL url = new URL("http://www.google.com");
        InetSocketAddress proxyAddress = new InetSocketAddress("address.of.proxy", 6060);
        Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyAddress);
        HttpURLConnection uc = (HttpURLConnection) url.openConnection(proxy);
        uc.connect();
        System.out.println(uc.getResponseCode());

По какой-то причине аутентификация попадает в цикл перенаправления, поэтому в результате аутентификатор печатает «аутентификацию» 20 раз, а затем исключение ProtocolException.

java.net.ProtocolException: Server redirected too many  times (20)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1846)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)
at java.net.URLConnection.getContent(URLConnection.java:739)
at proxytest.RunThis.main(RunThis.java:29)

Прокси работает с указанными учетными данными, я пробовал через браузер. Я пытаюсь заставить это работать в течение нескольких дней, я пытался настроить системные свойства, apache httpclient и все, что я мог получить от Google. Любые идеи приветствуются. :)

ОБНОВЛЕНИЕ:

Я тестировал с помощью WireShark, данные аутентификации прокси есть в запросе, но прокси выдает ошибку 407. Опять же, учетные данные в порядке, он отлично работает из браузера (я на самом деле скопировал их из исходного кода, чтобы убедиться).

Хотя есть одна вещь, которую я заметил. Значение заголовка Proxy-Authorization отличается одним и только одним символом между браузером и запросом, отправленным java. Может это что-то значит?


person Koocka    schedule 05.05.2015    source источник
comment
у меня точно такая же проблема... есть ли у вас решение или какие-то новые идеи?   -  person Ben    schedule 08.01.2016
comment
Далее: я читал об использовании обработчика файлов cookie, но даже с включенным обработчиком файлов cookie по умолчанию CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); я получаю тот же результат...   -  person Ben    schedule 08.01.2016
comment
@Koocka Привет, у тебя получилось?   -  person Inoy    schedule 21.04.2016
comment
у меня такая же проблема..   -  person dinhokz    schedule 11.10.2016


Ответы (2)


Authenticator.setDefault(authenticator); должен стоять после openConnection(proxy);

URL url = new URL("http://www.google.com");
InetSocketAddress proxyAddress = new InetSocketAddress("address.of.proxy", 6060);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyAddress);
HttpURLConnection uc = (HttpURLConnection) url.openConnection(proxy);
    Authenticator.setDefault(new Authenticator() {
          protected PasswordAuthentication getPasswordAuthentication() {
            return (new PasswordAuthentication("username", "password".toCharArray()));
          }
        });
uc.connect();
System.out.println(uc.getResponseCode());
person Andres Robles    schedule 07.02.2021

Просто установите свойство JVM:

jdk.http.auth.tunneling.disabledSchemes = ""

См.: http://www.oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html

Оставьте это здесь, потому что в течение часа я исследовал этот вопрос.

person alex_ua    schedule 19.09.2017
comment
Добро пожаловать в StackOverflow. Узнайте, как написать хороший ответ, здесь: Как ответить. - person Marco; 19.09.2017