在与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

10-06 03:32