Не работает ли Java ProxySelector с автоматическими сценариями настройки прокси-сервера?
Я хочу, чтобы моя программа Java использовала конфигурацию прокси-сервера. Соответственно, я использовал код, найденный во многих местах, например этот ответ, чтобы установить java.net.useSystemProxies
в true и вызвать ProxySelector.getDefault().select(...)
, чтобы обнаружить прокси для конкретного хоста Я хочу добраться. Это отлично работает, когда я настроил один явный прокси-сервер в свойствах Интернета. Но если я установил "Использовать автоматическую конфигурацию script", он всегда возвращает DIRECT "прокси".
Я знаю, что работает script, так как мой браузер может обращаться к хостам, для которых он возвращает прокси-сервер, и без набора script он не может. Я даже попробовал упростить script до его самого необходимого:
function FindProxyForURL(url, host)
{
return "PROXY my.proxy.mydomain:3128";
}
и он работает в моем браузере, но ProxySelector.getDefault().select(...)
по-прежнему возвращает только DIRECT.
Я что-то упустил? (Это на Java 1.6 и Windows 7, если это имеет значение.)
Ответы
Ответ 1
Нет, Java ProxySelector не читает файлы Proxy Auto-Config (PAC).
Однако как предложил Брайан де Алвис в качестве ответа на мой аналогичный вопрос, Proxy Vole предоставит эту поддержку/возможности.
Чтобы обеспечить сетевое подключение из коробки для вас Java вы можете использовать библиотеку Proxy-Vole. Он предоставляет некоторые стратегии для автоматического определения текущих настроек прокси-сервера. Есть многие настраиваемые стратегии на выбор. На данный момент Proxy - Vole поддерживает следующие стратегии обнаружения прокси.
- Прочитайте настройки платформы (поддержка: Windows, KDE, Gnome, OSX)
- Прочитайте настройки браузера (поддержка: Firefox 3.x, Internet Explorer, Chrome и Webkit используют настройки платформы)
- Чтение переменных среды (часто используемых переменных в системах Linux/Unix)
- Автоопределение script с помощью WPAD/PAC (не все поддерживаемые варианты)
Ответ 2
Как уже было предложено Mads Hansen, Proxy-Vole делает трюк!
Вам просто нужно добавить банку с сайта загрузки в свой путь к классам (включены 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);
}
}
}
Ответ 3
Я могу загрузить файл Proxy Auto-Config (PAC) на Java. См. Ниже коды и пакет.
Надеюсь, это то, что вы искали:
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
Ответ 4
Вы можете использовать Proxy Vole для решения этой проблемы:
Если вы точно знаете, какой 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.