2014-11-04 25 views
0

我有一個URL重定向到另一個,重定向到另一個,我試圖獲得最終域。我認爲會重定向連接時發生,但運行此代碼告訴我,否則:何時發生URL重定向?

public static void main(String[] args) 
    { 
     System.out.println(resolveEndDomain("http://goo.gl/ELHEjl")); 
    } 

    private static String resolveEndDomain(String deepLink) 
    { 
     HttpURLConnection httpConnection = null; 
     try 
     { 
      httpConnection = (HttpURLConnection) new URL(deepLink).openConnection(); 
      //httpConnection.getResponseCode(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return httpConnection.getURL().getHost(); 
    } 

所以,如果我運行它,它只是給我goo.gl。但是,如果我取消註釋行以獲取響應代碼,它會從最終域中提取它並打印www.thomann.de。如果我使用getHeaderFields()getContent()或類似,但connect()似乎沒有幫助,則會發生同樣的情況。我對這些回覆中的任何一個都不感興趣,所以我該如何解決重定向問題?連接何時有效發生?

+0

重定向通常是服務器通知客戶端在別處查看的響應。所以重定向通常在服務器端發送,但客戶端必須遵循它。如果你檢查http狀態碼,你應該得到一個301或302,這表明響應包含你被重定向到的位置。 – Thomas 2014-11-04 12:54:08

+0

「www.thoman.de」有什麼問題。我會說這是你正在尋找的價值,不是嗎? – SJuan76 2014-11-04 13:00:56

+0

@Thomas不,如果首先調用'HttpURLConnection.setFollowRedirects(false)',代碼只有301。但沒有指定false,它應該自動跟隨鏈接,事實上,當我調用'getResponseCode()'時,它會給我一個200. – 2014-11-04 14:32:01

回答

0

至於你的問題,重定向發生在連接的服務器回覆301或302 HTTP狀態碼時。請注意,狀態碼是服務器答案的一部分,因此您必須實際向其請求資源(通常使用connect())。

正如您已經發現的那樣,HttpURLConnection通常會處理檢查重定向狀態碼的部分,並將您重定向到作爲重定向響應的一部分提供的URL(最多重定向,我不確定該位置的限制被定義爲)。

您可以設置followsRedirectsfalse和解釋HTTP標頭自己找到,如果你將被重定向或沒有,但直到你得到一個2X狀態代碼(或4XX - 不是發現,forbidden-或5XX - 服務器錯誤 - )你不確定你被重定向到的URL是否是最後一個。

例如,您可以連接到http://goo.gl/ELHEjl,並發現它將您重定向到http://www.bit.ly/s34314313。但是,除非您連接到該URL並獲取不是3XX狀態碼,否則您無法確定連接到http://www.bit.ly/s34314313是否是最終的資源位置,否則它只會重新定向您。