难道Java的的ProxySelector不会自动代理配置脚本工作?(Does Java's

2019-06-23 23:00发布

我希望我的Java程序使用系统的代理配置。 因此,我曾经在很多地方,如发现代码这个答案 ,设置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操作系统,它应该没关系。)

Answer 1:

不,在Java的ProxySelector不读代理自动配置(PAC)文件。

然而, 由布莱恩·德·Alwis所建议的回答为我类似的问题,在代理田鼠库似乎提供支持/能力。

田鼠库 - 为您的Java应用程序可以使用代理服务器提供网络连接的开箱。 它提供了一些方法能自动探测当前代理设置。 有许多configureable的战略选择。 目前代理 - 田鼠支持以下代理检测策略。

  • 阅读平台设置(支持:WINDOWS,KDE,GNOME,OSX)
  • 阅读浏览器设置(支持:3.X的Firefox,IE浏览器,浏览器和Webkit使用平台设置)
  • 阅读环境变量(在Linux / Unix服务器系统经常使用的变量)
  • 通过使用自动检测脚本WPAD / PAC(不支持的所有版本)


Answer 2:

正如马德斯·汉森已经建议, 代理田鼠的伎俩!

你只需要从下载网站上的jar添加到类路径(DLL被包括在内),该代码帮我配置代理stettings:

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


Answer 3:

我可以在Java的加载代理自动配置(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



Answer 4:

您可以使用代理田鼠来解决这个问题:

  • 原谷歌代码项目
  • 最近GitHub的项目 ,原来的分叉

如果你知道你要使用的到底是哪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。



文章来源: Does Java's ProxySelector not work with automatic proxy configuration scripts?
标签: java proxy