2016-02-13 70 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");