无法下载Java 6或7中的URL-适用于Java 5
我们有一些非常基本的代码可以从URL下载内容。它在大多数情况下运行良好,但是我们遇到了一些在j6或7中不起作用,但在j5中起作用的URL 这是相当标准的代码:无法下载Java 6或7中的URL-适用于Java 5,java,httpconnection,Java,Httpconnection,我们有一些非常基本的代码可以从URL下载内容。它在大多数情况下运行良好,但是我们遇到了一些在j6或7中不起作用,但在j5中起作用的URL 这是相当标准的代码: URL url = new URL(sUrl); URLConnection urlCon = url.openConnection(); if (debug) System.out.println("GETURL DEBUG : set user aganet"); urlCon.setRequestProperty("User
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");
一个不起作用的URL是:
在java 6/java-1.6.0-openjdk-1.6.0.0.x86_64或java 7 jdk1.7.0_71中运行时的输出如下:
GETURL调试:2014年10月28日星期二21:13:52开始
GETURL调试:检查生存时间
GETURL调试:将用户设置为aganet
GETURL调试:设置更多属性
GETURL调试:打开输入流
GETURL调试:获取url编码为空
GETURL调试:开始读取
GETURL调试:已完成
正如您所看到的,对readLine的第一次调用返回一个EOF。如果我们使用read而不是readLine,这是一样的
但是,如果我们改为使用Java5JRE-1.5.0
然后读取缓冲区,一点问题都没有
有趣的是,这两个URL似乎都重定向到https连接
由于心脏出血,我们的一些订阅源发生了一些连接问题。我们的解决方案是设置系统属性:
System.setPropertyhttps.protocols,TLSv1
而不是我们曾经拥有的:
System.setPropertyhttps.protocols,SSLv3,SSLv2Hello
但是,此属性的任一值都会产生相同的结果
如果我们尝试直接下载https版本,我们会得到以下结果:
[danielk@robot类]$。/geturl
GETURL调试:于2014年10月28日星期二21:44:28 EDT开始
GETURL调试:检查生存时间
GETURL调试:将用户设置为aganet
GETURL调试:设置更多属性
GETURL调试:打开输入流
同样,在Java5中,我们没有得到这个异常,数据是从URL成功下载的
以下是我们设置的接受任何证书的代码:
我使用curl测试url,http url将响应302状态码,重定向到https url。 我认为URLConnecton不会自动处理302状态,因为它是从http到https的,它只会自动从http重定向到http。我认为这是出于安全考虑。
因此,您可以手动处理它,检查状态代码,如果它是302,并且位置头是https,那么您可以打开到https url的新连接。您尝试过url.openStream吗?最后的代码丢失了。。。