我们有一些非常基本的代码可以从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成功下载数据。
以下是我们设置的代码,可以接受任何证书:
答案 0 :(得分:0)
我使用curl测试网址,http网址会响应302状态代码,重定向到https网址。 我不认为URLConnecton会自动处理302状态,因为它是从http到https,它会自动从http重定向到http。我认为这是安全问题 因此,您可以手动处理它,检查状态代码,如果它是302,并且位置头是https,那么您可以打开与https网址的新连接。