Как мне заставить HttpURLConnection использовать прокси?

137

Если я сделаю это ...

conn = new URL(urlString).openConnection();
System.out.println("Proxy? " + conn.usingProxy());

это печатает

Proxy? false

Проблема в том, что я за прокси. Откуда JVM получает информацию о прокси в Windows? Как мне это настроить? Все мои другие приложения кажутся совершенно довольными моим прокси.

IZB
источник

Ответы:

337

Начиная с Java 1.5, вы также можете передать экземпляр java.net.ProxyopenConnection(proxy) методу:

//Proxy instance, proxy ip = 10.0.0.1 with port 8080
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080));
conn = new URL(urlString).openConnection(proxy);

Если ваш прокси-сервер требует аутентификации, он даст вам ответ 407.

В этом случае вам понадобится следующий код:

    Authenticator authenticator = new Authenticator() {

        public PasswordAuthentication getPasswordAuthentication() {
            return (new PasswordAuthentication("user",
                    "password".toCharArray()));
        }
    };
    Authenticator.setDefault(authenticator);
NickDK
источник
7
Можем ли мы предоставить имя пользователя прокси и пароль прокси через него.
Ксольв
15
Что делать, если у вас разные пары имени пользователя и пароля для разных прокси? Вызов статического метода для установки аутентификатора по умолчанию не идеален, это не намного лучше, чем установка метода свойств sys ..
javaPhobic
2
Authenticator.default является статической (то есть глобальной) переменной, поэтому это только один раз. Но обратите внимание, что указанный выше Authenticator является лишь минимальным примером. Он может обрабатывать только один пароль за раз. Google для примеров, которые могут обрабатывать несколько хостов с разными паролями.
Стробоскоп
3
Начиная с версии 8u11, это не будет работать по умолчанию с базовой аутентификацией, системное свойство oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabledisabledSchemes должно быть установлено на emtpty
белый
3
Если у вас есть домен. Сделайте следующее:new PasswordAuthentication("domainName\\user", "password".toCharArray());
Разработчик Marius Žilėnas
34

Это довольно легко ответить из Интернета. Установите системные свойства http.proxyHostи http.proxyPort. Вы можете сделать это с помощью System.setProperty()или из командной строки с помощью -Dсинтаксиса.

Шон Оуэн
источник
19

Прокси поддерживаются через два системных свойства: http.proxyHost и http.proxyPort. Они должны быть установлены на прокси-сервер и порт соответственно. Следующий базовый пример иллюстрирует это:

String url = "http://www.google.com/",
       proxy = "proxy.mydomain.com",
       port = "8080";
URL server = new URL(url);
Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",proxy);
systemProperties.setProperty("http.proxyPort",port);
HttpURLConnection connection = (HttpURLConnection)server.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
readResponse(in);
Паскаль Тивент
источник
@Pascal Вы знаете, каковы основные отличия использования новейшего подхода Java по сравнению с Apache commons-httpclient? Поскольку Java поддерживает проксирование и аутентификацию (как вы упомянули здесь stackoverflow.com/questions/1626549/… ), для простых случаев (таких как получение одного файла с общедоступного HTTP-сервера) нет причин использовать библиотеку Apache. Какова ваша рекомендация?
dma_k 04
@dma_k Я согласен с вами, для простых случаев использования, подобных описанному вами, я не буду использовать стороннюю библиотеку.
Паскаль Тивент, 04
Вы знаете, как поддерживать nonProxyHosts? Я вижу, что мое устройство поддерживает его, но не знает, как заставить мое приложение справиться с этим.
RiRomain
Но переменная systemPropertiesне используется connection!
parsecer
12

Вы также можете установить

-Djava.net.useSystemProxies=true

В Windows и Linux это будет использовать системные настройки, поэтому вам не нужно повторяться (СУХОЙ)

http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html#Proxies

Дэниел Уортингтон-Бодарт
источник
6
Это работает только при ручной настройке прокси-сервера. Автоматическая конфигурация прокси и прокси, сконфигурированные через скрипт, (пока) не передаются в «useSystemProxies».
Шины
1
Это сработало для меня при настройке proxyHost, а proxyPort - нет. Спасибо!
Нробей
Кроме того, это работает из - за моей компании прокси , когда вызовы к System.setPropertyдля https.proxyHostи https.proxyPortпо какой - то причине не резали горчицу.
Павел Комаров
10

Установите следующее перед тем, как открытьConnection,

System.setProperty("http.proxyHost", "host");
System.setProperty("http.proxyPort", "port_number");

Если прокси-сервер требует аутентификации,

System.setProperty("http.proxyUser", "user");
System.setProperty("http.proxyPassword", "password");
ZZ Coder
источник
7
Я на самом деле думаю, что "http.proxyUser" и "http.proxyPassword" больше не поддерживаются. См. Stackoverflow.com/questions/120797/… для получения дополнительной информации.
p3t0r
5

Для Java 1.8 и выше вы должны установить -Djdk.http.auth.tunneling.disabledSchemes=прокси с базовой авторизацией, работающей с https.

Антон
источник
1
Справочная информация об этом обсуждается на stackoverflow.com/questions/41806422/…
U880D
2

Утвержденный ответ будет работать ... если вы знаете свой прокси-сервер и порт =). Но если вы ищете прокси-хост и порт, следующие шаги должны помочь.

если указан автоматически настроенный прокси:

1> открыть IE (или любой браузер)

2> получить URL-адрес из браузера через IE-> Сервис-> Интернет-опции-> Подключения-> Настройки локальной сети-> получить адрес и ввести URL-адрес, например: http://autocache.abc.com/ и ввести, a файл будет загружен в формате .pac, сохранить на рабочий стол

3> откройте файл .pac в текстовой панели, укажите ПРОКСИ:

В вашем редакторе это будет выглядеть примерно так:

return "PROXY web-proxy.ind.abc.com:8080; PROXY proxy.sgp.abc.com:8080";

Престижность bekur от maven через 5 мин не работает

Как только у вас есть хост и порт, просто зайдите в это, и ваше дело

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080));
        URLConnection connection = new URL(url).openConnection(proxy);
Norbert
источник