无法下载Java 6或7中的URL - 适用于Java 5

时间:2014-10-29 01:31:48

标签: java httpconnection

我们有一些非常基本的代码可以从URL下载内容。它在大多数情况下都可以正常工作,但是我们遇到的情况是它们在j6或7中不起作用,但是在j5中起作用。

这是相当标准的代码:

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:从2014年10月28日星期二21:13:52开始   GETURL DEBUG:检查生活时间
  GETURL DEBUG:设置用户aganet
  GETURL DEBUG:设置更多合适的人选   GETURL DEBUG:打开输入流
  GETURL DEBUG:让网址编码为null   GETURL DEBUG:开始阅读   GETURL DEBUG:已完成

正如您所看到的,第一次调用readLine()会返回一个EOF。如果我们使用read()而不是readLine()

,它们也是一样的

但是,如果我们改为使用Java 5(jre-1.5.0)

然后缓冲区读取完全没问题。

有一点感兴趣的是,这两个网址似乎都会重定向到https连接。

我们遇到了一些连接问题,其中一些Feed由于心跳而发生了变化。我们的解决方案是设置系统属性:         System.setProperty(“https.protocols”,“TLSv1”);

而不是我们曾经拥有的:         System.setProperty(“https.protocols”,“SSLv3,SSLv2Hello”);

但是,此属性的任何一个值都会产生相同的结果。

如果我们尝试直接下载https版本,我们会这样: [danielk @机器人类] $ ./geturl“https://www.beteasy.com.au” GETURL DEBUG:从2014年10月28日星期二21:44:28开始 GETURL DEBUG:检查生存时间 GETURL DEBUG:设置用户aganet GETURL DEBUG:设置更多合适的人选 GETURL DEBUG:打开输入流

同样,在Java 5中,我们没有得到此异常,并且已从URL成功下载数据。

以下是我们设置的代码,可以接受任何证书:

1 个答案:

答案 0 :(得分:0)

我使用curl测试网址,http网址会响应302状态代码,重定向到https网址。 我不认为URLConnecton会自动处理302状态,因为它是从http到https,它会自动从http重定向到http。我认为这是安全问题 因此,您可以手动处理它,检查状态代码,如果它是302,并且位置头是https,那么您可以打开与https网址的新连接。