2011-05-15 216 views
7

我正在嘗試使用Java在網頁中查找所有損壞的鏈接。這裏是代碼:檢查損壞的鏈接

private static boolean isLive(String link){ 

    HttpURLConnection urlconn = null; 
    int res = -1; 
    String msg = null; 
    try{ 

     URL url = new URL(link); 
     urlconn = (HttpURLConnection)url.openConnection(); 
     urlconn.setConnectTimeout(10000); 
     urlconn.setRequestMethod("GET"); 
     urlconn.connect(); 
     String redirlink = urlconn.getHeaderField("Location"); 
     System.out.println(urlconn.getHeaderFields()); 
     if(redirlink != null && !url.toExternalForm().equals(redirlink)) 
      return isLive(redirlink); 
     else 
      return urlconn.getResponseCode()==HttpURLConnection.HTTP_OK; 

    }catch(Exception e){ 

     System.out.println(e.getMessage()); 
     return false; 

    }finally{ 

     if(urlconn != null) 
      urlconn.disconnect(); 

    } 


} 

public static void main(String[] s){ 

    String link = "http://www.somefakesite.net"; 
    System.out.println(isLive(link)); 

} 

代碼從http://nscraps.com/Java/146-program-code-broken-link-checker.htm引用。

此代碼爲所有網頁(包括破損網頁)提供HTTP 200狀態。例如 http://www.somefakesite.net/給出以下標題字段:

{null = [HTTP/1.1 200 OK],Date = [Sun,2011年5月15日18:51:29 GMT],Transfer-Encoding = [chunked],Keep -Alive = [timeout = 4,max = 100],Connection = [Keep-Alive],Content-Type = [text/html],Server = [Apache/2.2.15(Win32)PHP/5.2.12],X -Powered-通過= [PHP/5.2.9-1]}

即使不存在這樣的站點,如何將它歸類爲一個破碎的鏈接?

+0

你100%確定你正在測試什麼網站?嘗試在該方法的頂部添加一個'System.out.println(link);'。 – Mat 2011-05-15 19:03:18

+0

@Mat:是的,我確實添加了print語句,它正在測試從主 – user754740 2011-05-16 06:28:00

回答

4

也許問題是,目前大量的網絡服務器和DNS提供商的檢測這些「破」的鏈接和您重定向到他們的「未找到」的頁面。

根據您知道發送404代碼的URL(它顯示瀏覽器原始消息)對其進行測試。


編輯回答人提交的評論(因爲它是太長,不適合在評論): 我沒有看到你的問題一個簡單的答案,但有幾種不同類型的故障:

  • 對於重定向的DNS失敗(DNS無法找到的URL,並且您被重定向到另一個頁面)。所有重定向(如果您重定向)可能會進入同一頁面(由您的ISP/DNS提供商提供),您可以檢查。當然,如果您嘗試使用其他ISP/DNS提供商,頁面可能會有所不同。如果你沒有被重定向,那麼你會得到一個連接錯誤。
  • 對於具有有效DNS但無法工作的服務器(例如,google.com宕機),應該存在連接錯誤。
  • 對於服務器中缺少的資源(「頁面」)而言,這比較困難。 404意味着它被破壞了,但是如果服務器沒有發送它,那麼還有更多事情要做。重定向可能有助於將鏈接標記爲可疑,但應稍後手動檢查它,因爲它不僅用於捕獲缺少的鏈接(例如,www.google.com將我重定向到www.google.es)
+2

傳遞的正確鏈接。另外,如果情況並非如此,則「somefakesite.com」將返回連接錯誤,而不是404狀態因爲正在運行的服務器中缺少的資源與缺少的服務器不一樣)。 – SJuan76 2011-05-15 19:10:48

+0

我測試了2個斷開的鏈接,它們都顯示不同的狀態。 1. http://legacy.ncsu.edu/ECE566 {NULL = [HTTP/1.1 404未找到] 狀態 - 404 2. http://somefakewebsite.net {NULL = [HTTP/1.1 200確定] 狀態 - 200 現在的問題是我應該檢查重定向斷開的鏈接的域標題?感謝你的幫助。 – user754740 2011-05-16 19:35:51

+0

@ user754740我試着用我的帖子編輯回答;不幸的是,我知道不容易解決。 – SJuan76 2011-05-17 09:55:39