2014-10-29 64 views
0

我們有一些非常基本的代碼可以從URL下載內容。它在大多數情況下工作正常,但是我們遇到了一對夫婦或者url,它不能在j6或者7中運行,但是在j5中運行。無法使用Java 6或7下載URL - 使用Java 5

這是相當標準代碼:

不起作用
URL url = new URL(sUrl); 
URLConnection urlCon = url.openConnection(); 
if (debug) 
    System.out.println("GETURL DEBUG : set user aganet"); 
urlCon.setRequestProperty("User-Agent", "SportsPunter.com Robot"); 
urlCon.setRequestProperty("Accept-Encoding", "gzip"); 
urlCon.setUseCaches(false); 
if (debug) 
    System.out.println("GETURL DEBUG : set more properites"); 
InputStream is = urlCon.getInputStream(); 
BufferedReader br = null; 
String urlencoding = urlCon.getContentEncoding(); 

if (debug) 
    System.out.println("GETURL DEBUG : got url encoding " + urlencoding); 

if (urlencoding == null) 
    urlencoding = ""; 
if (urlencoding.toLowerCase().indexOf("gzip") != -1) { 
    if (encoding.length() == 0) 
     br = new BufferedReader(new InputStreamReader(new GZIPInputStream(is))); 
    else 
     br = new BufferedReader(new InputStreamReader(new GZIPInputStream(is), encoding)); 
} else { 
    if (encoding.length() == 0) 
     br = new BufferedReader(new InputStreamReader(is)); 
    else 
     br = new BufferedReader(new InputStreamReader(is, encoding)); 
} 

String buffer = ""; 
StringBuffer sb = new StringBuffer(suggestedSize); 

long start = System.currentTimeMillis(); 
if (debug) 
    System.out.println("GETURL DEBUG : start reading"); 

while ((buffer = br.readLine()) != null) { 

    if (debug) 
     System.out.println("GETURL DEBUG : got buffer " + buffer); 
    // irrelevant code snip 
} 
if (debug) 
    System.out.println("GETURL DEBUG : finished"); 

網址爲 http://www.beteasy.com.au

當Java 6中(/java-1.6.0-openjdk-1.6運行的輸出。 0.0.x86_64)或Java 7(jdk1.7.0_71)如下:

的getURL DEBUG:開始在星期二10月28日21點13分52秒EDT 2014
的getURL DEBUG:檢查時間住
的getURL DEBUG:設置用戶aganet
的getURL DEBUG:設置更多的性質在
的getURL DEBUG:打開輸入流
的getURL DEBUG:得到URL編碼空
的getURL DEBUG:開始閱讀
的getURL DEBUG:完成

正如你所看到的,第一次調用readLine()會返回一個EOF。這是相同的,如果我們使用讀,而不是()的readLine()

然而,如果我們改變使用Java 5(JRE-1.5.0)

然後緩存被所有閱讀沒有問題。

感興趣的一點是,這兩個URL似乎都重定向到https連接。

我們一直有一些連接問題,由於心跳加速而導致更改。我們的解決方案是設置系統屬性: System.setProperty(「https.protocols」,「TLSv1」);

而不是我們曾經擁有的: System.setProperty(「https.protocols」,「SSLv3,SSLv2Hello」);

但是,此屬性的任何值都會導致相同的結果。

如果我們試圖直接下載HTTPS版本,我們得到這樣的: [danielk @機器人類] $ ./geturl 「https://www.beteasy.com.au」 的getURL DEBUG:開始於週二10月28日21時44分28秒EDT 2014 的getURL DEBUG:檢查時間住 的getURL DEBUG:設置用戶aganet 的getURL DEBUG:設置更多的性質在 的getURL DEBUG:打開輸入流

同樣,在Java 5中,我們沒有得到這個例外,並且數據被成功地從下載網址。

下面是代碼,我們已經設置到據稱接受任何證書:

+0

你試過'url.openStream()'? – Babel 2014-10-29 01:42:56

+0

您的代碼最後缺失... – Pokechu22 2014-10-29 02:20:47

回答

0

我用捲曲測試URL時,HTTP URL會迴應一個302狀態碼,重定向到HTTPS URL。 我不認爲URLConnecton會自動處理302狀態,因爲它是從http到https,它會自動從http重定向到http。我認爲這是安全問題。
所以你可以手動處理它,檢查狀態碼,如果它是302,並且Location頭是一個https,那麼你可以打開一個到https url的新連接。