Вопрос по java – Разве Java ProxySelector не работает со скриптами автоматической настройки прокси?

19

Я хочу, чтобы моя Java-программа использовала конфигурацию прокси-сервера системы. Соответственно, я использовал код, найденный во многих местах, таких какэтот ответ, установитьjava.net.useSystemProxies чтобы правда и зовProxySelector.getDefault().select(...) найти прокси для конкретного хоста, которого я хочу достичь. Это прекрасно работает, когда я настроил один явный прокси-сервер в свойствах Интернета. Но если я установил «Использовать скрипт автоматической настройки», он всегда возвращает DIRECT «прокси».

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

<code>function FindProxyForURL(url, host)
{
    return "PROXY my.proxy.mydomain:3128";
}
</code>

и это работает в моем браузере, ноProxySelector.getDefault().select(...) по-прежнему возвращает только DIRECT.

Я что-то пропустил? (Это на Java 1.6 и Windows 7, если это имеет значение.)

Ваш Ответ

4   ответа
1

Original Google Code project More recent GitHub project, forking original

Если вы точно знаете, какой PAC-файл вы хотите использовать, вы можете сделать:

UrlPacScriptSource source = new UrlPacScriptSource("http://www.example.org/proxy.pac");
PacProxySelector selector = new PacProxySelector(source);

ProxySelector.setDefault(selector);

Преимущество этого состоит в том, что это не связано с пользователем. Например, если вы запускаете его как службу Windows, вы можете запустить его на SYSTEM-пользователе, который может не иметь такой жеOS_DEFAULT настройки прокси (если есть) в качестве администратора-пользователя.

Подход с использованием системных / программных ценностей:

ProxySearch proxySearch = new ProxySearch();
proxySearch.addStrategy(Strategy.OS_DEFAULT);
proxySearch.addStrategy(Strategy.BROWSER);
proxySearch.addStrategy(Strategy.JAVA);
ProxySelector proxySelector = proxySearch.getProxySelector();

ProxySelector.setDefault(proxySelector); 

Это начинается сOS_DEFAULT, затемJAVA И наконецBROWSER в качестве стратегии для селектора прокси.

Этот код основан на коде GitHub, версия 1.0.3.

4

смотрите ниже коды и пакет. Я надеюсь, что это то, что вы искали:

import com.sun.deploy.net.proxy.*;
.
.
BrowserProxyInfo b = new BrowserProxyInfo();        
b.setType(ProxyType.AUTO);
b.setAutoConfigURL("http://yourhost/proxy.file.pac");       
DummyAutoProxyHandler handler = new DummyAutoProxyHandler();
handler.init(b);

URL url = new URL("http://host_to_query");
ProxyInfo[] ps = handler.getProxyInfo(url);     
for(ProxyInfo p : ps){
    System.out.println(p.toString());
}

У вас уже есть пакет [com.sun.deploy.net.proxy] на вашем компьютере! Найти [deploy.jar]; D

Что такое DummyAutoProxyHandler?
12

Proxy-полевка делает трюк!

Вам просто нужно добавить jar с сайта загрузки в ваш classpath (включены dll), и этот код помог мне настроить параметры прокси:

ProxySearch proxySearch = new ProxySearch();
proxySearch.addStrategy(Strategy.OS_DEFAULT); 
proxySearch.addStrategy(Strategy.JAVA); 
proxySearch.addStrategy(Strategy.BROWSER); 
ProxySelector proxySelector = proxySearch.getProxySelector(); 

ProxySelector.setDefault(proxySelector); 
URI home = URI.create("http://www.google.com"); 
System.out.println("ProxySelector: " + proxySelector); 
System.out.println("URI: " + home); 
List<Proxy> proxyList = proxySelector.select(home); 
if (proxyList != null && !proxyList.isEmpty()) { 
 for (Proxy proxy : proxyList) { 
   System.out.println(proxy); 
   SocketAddress address = proxy.address(); 
   if (address instanceof InetSocketAddress) { 
     String host = ((InetSocketAddress) address).getHostName(); 
     String port = Integer.toString(((InetSocketAddress) address).getPort()); 
     System.setProperty("http.proxyHost", host); 
     System.setProperty("http.proxyPort", port); 
   } 
 } 
}
Проект Proxy-Vole был бездействующим с 2013 года, но в GitHub есть некоторая активность в развилке:github.com/MarkusBernhardt/proxy-vole
то же самое для меня, getProxySelector () возвращает NULL (но только в моей Windows, в моей Linux тот же код работает!).
Ваш код работает отлично, спасибо. Просто небольшое предложение - 3-я строка должна бытьproxySearch.addStrategy(Strategy.JAVA);
Спасибо, вышешь. Просто исправил опечатку :)
Код не работает для меня :( Я получаю исключение NullPointerException в строке List & lt; Proxy & gt; proxyList = proxySelector.select (home); proxySelector имеет значение null, и если вы посмотрите на тело getProxySelector (), вы увидите, что оно всегда возвращает null ,
29

Автоконфигурация прокси (PAC) файлы.

Тем не мение,по предложению Брайана де Алвиса в качестве ответа на мой похожий вопросProxy Vole библиотека, кажется, обеспечивает эту поддержку / возможность.

To provide network connectivity out of the box for you Java application you can use the Proxy - Vole library. It provides some strategies for autodetecting the current proxy settings. There are many configureable strategies to choose from. At the moment Proxy - Vole supports the following proxy detection strategies.

Read platform settings (Supports: Windows, KDE, Gnome, OSX) Read browser setting (Supports: Firefox 3.x, Internet Explorer; Chrome and Webkit use the platform settings) Read environment variables (often used variables on Linux / Unix server systems) Autodetection script by using WPAD/PAC (Not all variations supported)
Кстати, инструкции немного вводят в заблуждение, в том смысле, что & quot; default & quot; конфигурация является бесполезной - она использует & quot; читать свойства системы java & quot; Стратегия, которую вы получите в первую очередь без этой библиотеки. То, что работало для меня, было ProxySearch proxySearch = new ProxySearch (); proxySearch.addStrategy (Strategy.OS_DEFAULT); myProxySelector = proxySearch.getProxySelector (); vanmelle
Кто-нибудь знает о легкой альтернативе прокси-полевке? 6 МБ кажутся немного тяжелыми из-за недостатка функциональности Java.
Спасибо за чаевые. Поиск в Google для «выбора Java-прокси» не найдет эту библиотеку, если вы не достаточно проницательны, чтобы понять, что некоторые фрагменты кода, проходящие мимо, являются частью полезной библиотеки. Это позор, что Java уже не делает этого сама, поскольку имеет структуру ProxySelector и знает, как найти обычный фиксированный прокси. vanmelle

Похожие вопросы