我希望我的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上,如果重要的话。)
答案 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)将从操作系统中读取。