2015-12-02 48 views
2

在一個測試,我做的:何時HttpUrlConnection.usingProxy()返回true?

System.setProperty("http.proxyHost", "localhost"); 
System.setProperty("http.proxyPort", "1080"); 

,然後打開一個連接:

connection = (HttpURLConnection)url.openConnection(); 
if (connection.usingProxy()) { 
    throw new Nope(); 
} 

正在使用的代理服務器,否則連接會失敗。但usingProxy()返回false。

我錯過了什麼?

回答

2

this page中有相當多的細節討論代理可以在應用程序中設置的不同方式,以及連接如何使用代理。

您還可以從調試代碼本身獲得重要的理解,從而得出與頁面中的描述相符的結論。

基本上,usingProxy()返回true,當滿足以下條件:

  1. 連接實際上是創建。在您的代碼中,url.openConnection()不會實際建立到該URL的連接。您需要調用connection.connect()(或隱式執行連接的操作)。這在openConnection()的Javadoc中提到:

    應該注意的是,URLConnection實例在創建時並不建立實際的網絡連接。只有在調用URLConnection.connect()時纔會發生這種情況。

  2. 代理集(使用系統屬性或通過java.net.Proxy類)指向可訪問的地址。所以請確保代理localhost:1080是一個有效的代理。

關於第二點的更多細節。 HttpUrlConnection依賴ProxySelector類(在上面的頁面中提到),該類查找註冊的代理地址。默認ProxySelector將忠實地獲取您在系統屬性中設置的代理,並且HttpUrlConnection將嘗試訪問代理。如果不可用,它將要求ProxySelector提供另一個代理(如果存在其他代理)。

我發現,包含在文檔中的對話是一個很好的解釋(斜體突出的部分嘗試連接到代理):

處理器:嘿,夥計,我試圖訪問java.example.org,我應該使用代理嗎?

ProxySelector:您打算使用哪種協議?

Handler:http,當然!

ProxySelector:在默認端口?

處理程序:讓我檢查....是的,默認端口。

ProxySelector:我明白了。然後,您將在端口8080上使用webcache.example.com作爲代理。

處理程序:謝謝。 <暫停>夥計,webcache.example.com:8080似乎沒有迴應!還有其他選擇嗎?

ProxySelector:當!好的,請嘗試在端口8080上使用webcache2.example.com。

處理程序:當然。似乎工作。謝謝。

ProxySelector:沒有汗水。再見。

(A注意,作者未提到它是一個富有裝飾性對話。)

+0

對話是一個滑稽的災難,它甚至不是準確的。選擇器不會提出任何問題。它提供了參數。 – EJP

+0

@EJP的確,作者提到他或她「稍微修飾一些」。我想突出說明在選擇下一個代理之前訪問代理的部分。 – manouti