Не работает ли Java ProxySelector с автоматическими сценариями настройки прокси-сервера? - программирование
Подтвердить что ты не робот

Не работает ли 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, если это имеет значение.)

4b9b3361

Ответ 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.