Як змусити HttpURLConnection використовувати проксі?


137

Якщо я це роблю ...

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

він друкує

Proxy? false

Проблема в тому, що я за проксі. Звідки JVM отримує інформацію про проксі у Windows? Як це встановити? Всі інші мої програми здаються абсолютно задоволеними моїм проксі.

Відповіді:


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);

7
чи можемо ми надати ім'я користувача проксі та пароль проксі-сервера через нього.
Xolve

15
Що робити, якщо у вас є різні пари імен користувача / пароля для різних проксі? Виклик статичного методу для встановлення замовчувача Authenticator не є ідеальним, це не набагато краще, ніж встановлення методу властивостей sys ..
javaPhobic

2
Authenticator.default є статичною (тобто глобальною) змінною, тому це лише один раз. Але зауважте, що аутентифікатор вище - лише мінімальний приклад. Він може обробляти лише один пароль одночасно. Google для прикладів, які можуть обробляти кілька хостів з різними паролями.
Стробоскоп

3
Оскільки 8u11 це не буде працювати за замовчуванням за допомогою базової автентифікації, oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabledShemes властивості системи потрібно встановити порожнім
білий

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

@dma_k Я згоден з вами, для простих випадків використання, таких як описаний вами, я б не використовував сторонні бібліотеки.
Паскаль Тивеннт

Чи знаєте ви, як підтримати nonProxyHosts? Я бачу, що мій пристрій підтримує це, але не знає, як змусити мою програму впоратися.
RiRomain

Але змінна systemPropertiesне використовується connection!
розбір

12

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

-Djava.net.useSystemProxies=true

У Windows та Linux для цього будуть використані системні налаштування, тому не потрібно повторювати себе (DRY)

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


6
Це працює лише з конфігурацією проксі-сервера вручну. Автоматична конфігурація проксі та проксі, налаштовані за допомогою скрипту, ще не розповсюджуються на "useSystemProxies".
Шини

1
Це працювало для мене, коли налаштування proxyHost і proxyPort не виконувалась. Дякую!
nrobey

Так само це працювало з-за проксі-сервера моєї компанії, коли дзвінки до System.setProperty для https.proxyHostі https.proxyPortза якою - то причини не різали гірчицю.
Павло Комаров

10

Виберіть наступне перед відкриттям Зв'язку,

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

Якщо проксі вимагає автентифікації,

System.setProperty("http.proxyUser", "user");
System.setProperty("http.proxyPassword", "password");

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 файл у текстовій панелі, ідентифікуйте PROXY:

У вашому редакторі вийде щось на кшталт:

повернути "PROXY web-proxy.ind.abc.com:8080; PROXY proxy.sgp.abc.com:8080";

kudos to bekur from maven за 5 хв. не працює

Після того, як у вас є хост і порт, просто введіть це і ваше добро

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080));
        URLConnection connection = new URL(url).openConnection(proxy);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.