7
如何避免在與URLConnection
建立連接時通過ProxySelector
,或者更確切地說,如何保證連接免受Java知道的任何代理的影響?如何在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"
(請注意協議如何從http
更改爲socket
)
我當然可以用這種方式創建我的ProxySelector,以便它總是返回Proxy.NO_PROXY
如果URI方案是socket
但我猜會有場合SOCKS代理在網站上,然後它不會是真實的。
讓我重申一個問題:我需要一種方法來確保特定的URLConnection
不使用代理,而不管可以設置什麼系統屬性或安裝了哪些ProxySelector。
我想你也可以設置'ProxySelector.setDefault(null);'。這將允許直接連接。 – Tunaki
@Tunaki。不幸的是,這將完全關閉ProxySelector併爲* all *連接關閉。 – peterh
直接連接通過'ProxySelector'是一個實現細節。你爲什麼在乎?你有沒有真正的問題? – EJP