1

我想调用一个安全的网络服务,使用我拥有的证书......服务器需要很长时间才能使用证书进行身份验证,而且,虽然第一次没问题,但用户会一遍又一遍地调用它(在相同的“会话”),我觉得我应该能够重用连接。

我有以下代码。

System.setProperty("javax.net.ssl.trustStorePassword", "");
System.setProperty("javax.net.ssl.trustStore", "trusted.cacerts");
System.setProperty("javax.net.ssl.keyStorePassword", "mypassword");
System.setProperty("javax.net.ssl.keyStore", "trusted.clientcerts");

URL url = new URL("https://remoteserver:8443/testservice");
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "text/xml");
connection.setDoOutput(true);
OutputStream os = connection.getOutputStream();
os.write(bytes);

BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}

connection.disconnect();

这很好用……但速度很慢。仅身份验证大约需要 10 秒。这种内部身份验证在这里很典型,无法加快速度。但是我不能以某种方式重用它吗?
我尝试在该代码url.connection和断开连接之间放置一个循环,以为我可以一次又一次地回忆它,但失败了(500)。我尝试过移动一些东西,以便第一次只执行一些命令,但它仍然失败。
我读到了keep-alive,但没有找到任何关于这是什么以及如何使用它的好例子(如果这甚至是一种有效的方式)。如果我通过 HTML、Firefox 或 IE 完成所有这些操作,我猜,浏览器能够缓存证书,所以每次在第一次之后都非常快。我可以模仿一些吗?

4

2 回答 2

1

更好的选择是使用 HttpClient 及其连接池机制。还看看 https keep-alive 是否会帮助你

于 2010-10-27T20:34:20.470 回答
0

试着不打电话connection.disconnect()……我认为你没有必要这样做。但是,您应该确保reader在完成后关闭它。

于 2010-10-27T20:29:20.783 回答