Java的ProxySelector不能与自动代理配置脚本一起使用吗?

时间:2012-04-25 23:01:14

标签: java proxy

我希望我的Java程序使用系统的代理配置。因此,我使用在许多地方找到的代码(例如this answer)将java.net.useSystemProxies设置为true,并调用ProxySelector.getDefault().select(...)来发现我想要访问的特定主机的代理。当我在Internet属性中配置单个显式代理服务器时,这可以正常工作。但是如果我设置了“使用自动配置脚本”,它总是返回DIRECT“代理”。

我知道该脚本有效,因为我的浏览器可以访问它返回代理服务器的主机,并且没有设置脚本,它不能。我甚至尝试将脚本简化为最基本的要点:

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

它可以在我的浏览器中使用,但ProxySelector.getDefault().select(...)仍然只返回DIRECT。

我错过了什么吗? (这是在Java 1.6和Windows 7上,如果重要的话。)

5 个答案:

答案 0 :(得分:29)

不,Java ProxySelector不会读取Proxy Auto-Config (PAC)个文件。

但是,as suggested by Brian de Alwis作为我类似问题的答案, Proxy Vole 库似乎提供了支持/功能。

  

为Java提供开箱即用的网络连接   应用程序,您可以使用Proxy - Vole库。它提供了一些   自动检测当前代理设置的策略。有   许多可配置的策略可供选择。目前代理 -   Vole支持以下代理检测策略。

     
      
  • 读取平台设置(支持:Windows,KDE,Gnome,OSX)
  •   
  • 阅读浏览器设置(支持:Firefox 3.x,Internet Explorer; Chrome和Webkit使用平台设置)
  •   
  • 读取环境变量(Linux / Unix服务器系统上经常使用的变量)
  •   
  • 使用WPAD / PAC自动检测脚本(并非支持所有版本)
  •   

答案 1 :(得分:12)

正如Mads Hansen已经提出的那样,Proxy-Vole可以解决问题!

您只需要将下载站点中的jar添加到类路径(包括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); 
   } 
 } 
}

答案 2 :(得分:4)

我可以在Java上加载Proxy Auto-Config(PAC)文件。请参阅以下代码和包装。 我希望这会是你想要的:

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

答案 3 :(得分:1)

您可以使用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。

答案 4 :(得分:1)

是的,from version 9自动代理配置(PAC / WPAD)将从操作系统中读取。