2016-02-13 71 views
2

我正在編寫一個測試許多網站的有效性的程序。我的計劃是獲取URL,在前面附加http並使用HttpURLConnection類。在Java中測試網站有效性

我的問題是,我有時會得到403響應代碼被禁止。有沒有辦法解決?如果我得到一個403禁止的意思,這意味着該網站確實有效?我用403代碼將URL粘貼到瀏覽器中,並且能夠很好地連接。

另一個問題是,我經常得到301,302和303,我知道這些與重定向有關。然後我從頭部的「位置」鍵中獲取重定向網址。連接到這些時,我會收到與證書鏈相關的錯誤。我相信這可以通過使用包含我們認爲有效的證書或證書頒發者列表的KeyStore來解決。這聽起來是對的嗎?

謝謝。

我沒有我的電腦上的代碼,但我會嘗試重新創建它。

pingSuccess = false; 

HttpUrlConnection connection = (HttpUrlConnection) new URL(urlString).openConnection(); 
int response = connection.getResponseCode(); 

if(response == 301 || response == 302 || response == 303) { 
    String newUrl = connection.getHeaderSomething("Location"); 
    connection = (HttpUrlConnection) new URL(newUrl).openConnection(); 
    response = connection.getResponseCode(); 

    if(response == 200) 
     pingSuccess = true; 

} 

return pingSuccess; 

回答

0

403 - 禁止訪問

這表明一個基本接入問題,這可能是難以解決的,因爲HTTP協議允許Web服務器把這個響應,而完全不提供任何理由。所以403錯誤相當於Web服務器的一個'NO' - 沒有進一步的討論。

迄今爲止,此錯誤最常見的原因是網站的目錄瀏覽被禁止。大多數網站都希望您使用該網站的網頁中的網址進行瀏覽。他們經常不允許您瀏覽網站的文件目錄結構。例如嘗試以下網址(然後點擊「返回」按鈕,在瀏覽器中返回此頁):

http://www.browsesites.com/accounts/B1394343/

此URL應會失敗,一個403錯誤說「禁止訪問:你不沒有權限訪問/帳戶/ B1394343 /在此服務器上「。這是因爲我們的瀏覽網站故意不希望您瀏覽目錄 - 您必須使用這些網頁中的超鏈接從一個特定網頁導航到另一個網頁。這對於Internet上的大多數Web站點都是如此 - 它們的Web服務器將「允許目錄瀏覽」設置爲OFF。

您首先需要確認您是否遇到「無目錄瀏覽」問題。如果URL以斜槓'/'結尾而不是特定網頁的名稱(例如.htm或.html),您可以看到這一點。如果這是您的問題,那麼您別無選擇,只能直接訪問該網站的單個網頁。

嘗試了少量小修改的代碼。發佈代碼:

package general; 

import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.UnknownHostException; 

import javax.net.ssl.SSLSocket; 
import javax.net.ssl.SSLSocketFactory; 

public class HTTPLinkTest { 

public static boolean testLink(String urlLink){ 
    boolean pingSuccess = false; 

    try { 
     System.out.println("Test validity of URL:" + urlLink); 
     URL myUrl = new URL(urlLink); 
     HttpURLConnection connection; 

     connection = (HttpURLConnection) myUrl.openConnection(); 

     int response = connection.getResponseCode(); 

     if(response == 301 || response == 302 || response == 303) { 
      String newUrl = connection.getHeaderField("Location"); 
      System.out.println("Got redirected to new URL:" + newUrl); 
      connection = (HttpURLConnection) new URL(newUrl).openConnection(); 
      response = connection.getResponseCode(); 
      // Request has succeeded 
      if(response == 200) 
       pingSuccess = true; 

     } 
    }catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return pingSuccess; 
} 

public static boolean testSSLConnection(String sslLink){ 
    try { 
     SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault(); 
     String host = sslLink; 
     int port = 443; 
     System.out.println("Creating secure socket to " + host + ":" + port); 

     SSLSocket socket = (SSLSocket) factory.createSocket(host, port); 
     String[] suites = socket.getSupportedCipherSuites(); 
     System.out.println("Supported suites are:"); 
     for (String suite : suites){ 
      System.out.println(suite); 
     } 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }  
    return true; 
} 

public static void main(String[] args) { 
    String[] sslLinks = {"netbanking.hdfcbank.com"}; 
    for (String sslLink: sslLinks){ 
     testSSLConnection(sslLink); 
    } 

    String[] links = {"http://www.yahoo.com" , "http://www.yahoo.com/book"}; 
    for (String link : links){ 
     System.out.println("Test Result: " + link + (testLink(link) ? " is Valid URL":" is Invalid URL")); 
     System.out.println(); 
    } 
} 
} 

輸出: 創建安全套接字netbanking.hdfcbank。COM:443

支持的套房: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDH_RSA_WITH_AES_128_CBC_SHA TLS _DHE_RSA_WITH_AES_128_CBC_SHA TLS_DHE_DSS_WITH_AES_128_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA SSL_RSA_WITH_3DES_EDE_CBC_SHA TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA TLS_EMPTY_RENEGOTIATION_INFO_SCSV TLS_DH_anon_WITH_AES_128_GCM_SHA256 TLS_DH_anon_WITH_AES_128_CBC_SHA256 TLS_ECDH_anon_WITH_AES_128_CBC_SHA TLS_DH_anon_WITH_AES_128_CBC_SHA TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA SSL_DH_anon_WITH_3DES_EDE_CBC_SHA SSL_RSA_WITH_DES_CBC_SHA SSL_DHE_RSA_WITH_DES_CBC_SHA SSL_DHE_DSS_WITH_DES_CBC_SHA SSL_DH_anon_WITH_DES_CBC_SHA SSL_RSA_EXPORT_WITH_DES40_CBC_SHA SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA SSL_DH_an on_EXPORT_WITH_DES40_CBC_SHA TLS_RSA_WITH_NULL_SHA256 TLS_ECDHE_ECDSA_WITH_NULL_SHA TLS_ECDHE_RSA_WITH_NULL_SHA SSL_RSA_WITH_NULL_SHA TLS_ECDH_ECDSA_WITH_NULL_SHA TLS_ECDH_RSA_WITH_NULL_SHA TLS_ECDH_anon_WITH_NULL_SHA SSL_RSA_WITH_NULL_MD5 TLS_KRB5_WITH_3DES_EDE_CBC_SHA TLS_KRB5_WITH_3DES_EDE_CBC_MD5 TLS_KRB5_WITH_DES_CBC_SHA TLS_KRB5_WITH_DES_CBC_MD5 TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 URL的 試驗有效性:http://www.yahoo.com 了redirec關於新網址:https://www.yahoo.com/

+0

關於您的SSL/TLS查詢,您能分享您的代碼/代碼段與輸出。 – Learner

+0

但是如果我在檢查Java中的響應代碼時得到403,但是當我在瀏覽器中訪問網站時它工作正常嗎?我檢查的網址最後沒有「/」。謝謝。 –

+0

你能分享你的代碼片段嗎? – Learner

1

我在網上搜了一下,發現了這個。我在連接上設置了這一點,並且我能夠得到一個以前給出403的網站的200響應(好),即使在瀏覽器中訪問網站也沒問題。

conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36");