2015-11-06 50 views
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。

+1

我想你也可以設置'ProxySelector.setDefault(null);'。這將允許直接連接。 – Tunaki

+0

@Tunaki。不幸的是,這將完全關閉ProxySelector併爲* all *連接關閉。 – peterh

+1

直接連接通過'ProxySelector'是一個實現細節。你爲什麼在乎?你有沒有真正的問題? – EJP

回答