2014-10-29 68 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的新连接。