在与ProxySelector
建立连接时,如何避免遍历URLConnection
?或者如何确保没有Java知道的任何代理都可以保证获得连接?
我以为这就是Proxy.NO_PROXY的目的。引用Javadoc:
但是,这样的连接仍将通过ProxySelector。我不明白吗?
我做了一个小测试以证明我的观点:
public static void main(String[] args) throws MalformedURLException, IOException {
ProxySelector.setDefault(new MyProxySelector());
URL url = new URL("http://foobar.com/x1/x2");
URLConnection connection = url.openConnection(Proxy.NO_PROXY);
connection.connect();
}
和一个伪ProxySelector,它什么都不做,只记录正在发生的事情:
public class MyProxySelector extends ProxySelector {
@Override
public List<Proxy> select(URI uri) {
System.out.println("MyProxySelector called with URI = " + uri);
return Collections.singletonList(Proxy.NO_PROXY);
}
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {}
}
打印:
"MyProxySelector called with URI = socket://foobar.com:80"
(请注意,协议(protocol)是如何从
http
更改为socket
的)当然,我可以以这种方式创建我的ProxySelector,以便如果URI方案是
Proxy.NO_PROXY
,它总是返回socket
,但是我想有时候在站点上有一个SOCKS代理,然后那不是真的。让我重申一下这个问题:无论是否设置了什么“系统属性”或安装了什么ProxySelector,我都需要一种方法来确保特定的
URLConnection
不使用代理。 最佳答案
被跟踪为JDK bug 8144008。