8个月前,我使用此stack overflow post在Java项目中自动使用代理服务器。它运作得很漂亮。
以下是我当时提出的代码:
System.setProperty("java.net.useSystemProxies", "true");
List<Proxy> proxyServers = null;
try {
proxyServers = ProxySelector.getDefault().select(new URI("http://www.twitter.com"));
} catch (URISyntaxException e) {
System.out.println("Error using system proxy");
}
if (proxyServers != null) {
for (Iterator<Proxy> iter = proxyServers.iterator(); iter.hasNext();) {
Proxy proxy = iter.next();
System.out.println("Found Proxy: " + proxy);
InetSocketAddress addr = (InetSocketAddress) proxy.address();
if (addr == null) {
System.out.println("No Proxy");
} else {
System.setProperty("http.proxyHost", addr.getHostName());
System.setProperty("http.proxyPort", Integer.toString(addr.getPort()));
System.out.println("proxy hostname : " + addr.getHostName());
System.out.println("proxy port : " + addr.getPort());
}
}
}
我最近尝试将这个完全相同的代码添加到另一个项目中,并得到了不同的结果。我的计算机设置使用测试代理服务器并运行两个项目来比较结果。如果我从8个月前开始运行该项目,则打印出以下内容:
Found Proxy: HTTP @ 192.168.1.100:8000
proxy hostname : 192.168.1.100
proxy port : 8000
如果我在设置了相同代理服务器的同一台机器上运行当前项目,则打印出以下内容。
Found Proxy: DIRECT
No Proxy
找到的唯一代理是“Direct”,proxy.address()为null。
什么会导致在一种情况下找到代理设置而不是另一种呢?
修改
我通过在启动过程中更快地移动代码来解决这个问题,但我不知道为什么要修复它。
答案 0 :(得分:2)
可能是由http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html#Proxies
中的这句话引起的java.net.useSystemProxies(默认值:false)在最近的Windows系统上 在Gnome 2.x系统上,可以告诉java.net堆栈, 将此属性设置为true,以使用系统代理设置 (这两个系统都允许您通过用户全局设置代理 接口)。 请注意,此属性仅在启动时检查一次。
如果将属性放在java命令中,则可以保证它正常工作:java -Djava.net.useSystemProxies=true yourclass
此致
答案 1 :(得分:0)
如果将代码与安全页面一起使用,它将不考虑代理,因此将显示“直接”和“不代理”。
尝试以下代码:
proxyServers = ProxySelector.getDefault().select(new URI("http://www.twitter.com"));
proxyServers = ProxySelector.getDefault().select(new URI("https://www.twitter.com"));
您会有所不同。