【发布时间】:2011-06-23 10:49:21
【问题描述】:
我需要自动检测用户是否需要代理才能访问互联网。 Java 应用程序有没有办法读取系统代理设置?
谢谢, 吉米
【问题讨论】:
我需要自动检测用户是否需要代理才能访问互联网。 Java 应用程序有没有办法读取系统代理设置?
谢谢, 吉米
【问题讨论】:
Java SE 1.5 提供了 ProxySelector 类来检测代理设置。如果直接连接到 Internet,则代理类型将为 DIRECT,否则它将返回主机和端口。
以下示例说明了此功能:
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
import java.util.Iterator;
import java.util.List;
public class TestProxy {
public static void main(String[] args) {
try {
System.setProperty("java.net.useSystemProxies","true");
List<Proxy> l = ProxySelector.getDefault().select(
new URI("http://www.yahoo.com/"));
for (Iterator<Proxy> iter = l.iterator(); iter.hasNext(); ) {
Proxy proxy = iter.next();
System.out.println("proxy hostname : " + proxy.type());
InetSocketAddress addr = (InetSocketAddress)proxy.address();
if(addr == null) {
System.out.println("No Proxy");
} else {
System.out.println("proxy hostname : " + addr.getHostName());
System.out.println("proxy port : " + addr.getPort());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
【讨论】:
other,接受,答案无疑是极好的和正确的,但我想我会在这里添加一些东西......
如果您在配置了“自动检测代理设置”的机器上,我相信它被称为PAC,那么使用 Java gubbins 在答案中检测代理的代码将不起作用(它会认为它是“直接”连接)。
有一个名为 proxy vole 的库(我认为是新的 BSD license),但是,您可以使用它,所以这里是 other 答案的代码稍作修改以使用它:
public class testProxy {
public static void main(String[] args) {
try {
System.setProperty("java.net.useSystemProxies","true");
// Use proxy vole to find the default proxy
ProxySearch ps = ProxySearch.getDefaultProxySearch();
ps.setPacCacheSettings(32, 1000*60*5);
List l = ps.getProxySelector().select(
new URI("http://www.yahoo.com/"));
//... Now just do what the original did ...
for (Iterator iter = l.iterator(); iter.hasNext(); ) {
Proxy proxy = (Proxy) iter.next();
System.out.println("proxy hostname : " + proxy.type());
InetSocketAddress addr = (InetSocketAddress)
proxy.address();
if(addr == null) {
System.out.println("No Proxy");
} else {
System.out.println("proxy hostname : " +
addr.getHostName());
System.out.println("proxy port : " +
addr.getPort());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
它需要这些导入:
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URI;
import java.util.Iterator;
import java.util.List;
import com.btr.proxy.search.ProxySearch;
哦,还有代理田鼠 here 的用法示例。
【讨论】: