5

我已经编写了一些代码来从网站下载文件。该代码适用于测试 http url。一旦我将 URL 更改为 https,就会出现连接超时。

System.setProperty("http.proxyHost","trproxy.rwe.com") ;
System.setProperty("http.proxyPort", "80") ;
Authenticator.setDefault (new MyAuthenticator("USER","PW"));
//URL url = new URL("http","www.treasury.gov",80,"/ofac/downloads/sdn.csv",new    sun.net.www.protocol.http.Handler());  THIS WORKS
URL url = new URL("https", "downloads.elexonportal.co.uk",443,"/bmradataarchive/download?key=MYKEY&filename="+filename,new sun.net.www.protocol.https.Handler());
url.openConnection();
InputStream reader = url.openStream();
FileOutputStream writer = new FileOutputStream("C:/downloads/"+filename);

如果我将 https url 复制到浏览器中,系统会询问我希望将文件保存在哪里,并且工作正常。非常感谢任何帮助。我试过这个 但没有用

谢谢克里斯

4

3 回答 3

4

您可能遇到证书问题。这通常是我过去在 Java 中使用 HTTPS 连接时遇到的问题。

首先,您应该检查并查看您尝试连接的 URL 是否具有知名可信根 CA 的签名证书,并且有效(未过期)。

我建议在浏览器中打开 URL 并检查证书信息。

仅供参考,您的浏览器识别的可信根 CA 与 Java 识别的可信根 CA 之间可能存在脱节。这是另一个关于如何让 Java 识别的 Stackoverflow 问题:如何在 Java 中获取受信任的根证书列表?

如果这是一个自签名证书,那么您将需要跳过有关将其导入和使用本地 Keystore 的麻烦。有许多站点和博客可以指导您完成此操作,这是一个这样的博客(不是我的):将自签名 https 证书添加到 java 密钥库

此外,当您使用浏览器进行测试时,这将帮助您验证没有代理问题。您绝对应该检查浏览器的设置,以确定您是否通过代理服务器。

您绝对应该考虑使用 HttpClient 而不是 java.net.URL。这是HttpClient 4.2.1 的 Apache 页面

最后,如果您希望通过 HTTP 或 HTTPS 进行文件传输,您可能需要考虑使用 WebDAV。

我过去曾为此使用过 Jakarta Slide WebDAV 客户端。不幸的是,Slide 目前似乎已退役,但您可以通过一些搜索找到替代方案。

添加

我复制了您的源代码示例并更仔细地查看了它。看起来您为 http 设置了属性,但没有为 https 设置属性。

HTTPS 具有单独的属性:

  • https.proxyHost
  • https.proxyPort

尝试设置:

System.setProperty("https.proxyHost","trproxy.rwe.com") ; 
System.setProperty("https.proxyPort", "443") ; 

查看关于Oracle 的 Java 网络和代理的第 2.2 节。

http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html

于 2012-08-29T18:16:36.707 回答
1

看起来您的问题可能与代理有关。它还应该支持https。此外,您应该使用 HttpClient 4 来下载文件,它是一个用于建立 http 连接的成熟库。

于 2012-08-29T16:22:46.063 回答
0

System.setProperty("http.proxyPort", "80")应该System.setProperty("http.proxyPort", "443")

于 2012-08-29T18:49:24.683 回答