我希望我的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操作系统,它应该没关系。)
不,在Java的ProxySelector不读代理自动配置(PAC)文件。
然而, 由布莱恩·德·Alwis所建议的回答为我类似的问题,在代理田鼠库似乎提供支持/能力。
田鼠库 - 为您的Java应用程序可以使用代理服务器提供网络连接的开箱。 它提供了一些方法能自动探测当前代理设置。 有许多configureable的战略选择。 目前代理 - 田鼠支持以下代理检测策略。
- 阅读平台设置(支持:WINDOWS,KDE,GNOME,OSX)
- 阅读浏览器设置(支持:3.X的Firefox,IE浏览器,浏览器和Webkit使用平台设置)
- 阅读环境变量(在Linux / Unix服务器系统经常使用的变量)
- 通过使用自动检测脚本WPAD / PAC(不支持的所有版本)
正如马德斯·汉森已经建议, 代理田鼠的伎俩!
你只需要从下载网站上的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);
}
}
}
我可以在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
您可以使用代理田鼠来解决这个问题:
- 原谷歌代码项目
- 最近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?