【问题标题】:Reusing an HttpsUrlConnection... don't want to get a new connection each time. How reuse?重用 HttpsUrlConnection... 不想每次都获得新的连接。怎么复用?
【发布时间】:2010-10-27 20:04:33
【问题描述】:

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

我有以下代码。

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 完成所有这些操作,我猜,浏览器能够缓存证书,所以每次在第一次之后都非常快。我可以模仿一下吗?

【问题讨论】:

    标签: java https certificate webservices-client


    【解决方案1】:

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

    【讨论】:

    • hhmmm...尝试这个....但是,我似乎无法获得正确的过程来发送我的数据。我正在调用的 Restful 服务在 Post 上接收一个 XML 字符串 (@Consumes text/xml)。然而,HttpClient 的 PostMethod 似乎希望我为参数提供键/值对(同样,我所拥有的只是 XML 字符串)。当我尝试调用它时,会调用不正确的服务(网络表单服务)。如何使用 HttpClient 发布 XML 流?使用 HttpsURLConnection,我刚刚编写了输出流。我在 PostMethod(或 HttpClient)中找不到这个。
    • RequestEntity.. 明白了!!!... 一次通话即可工作.. 现在将尝试重用。谢谢!
    • 似乎有效.... 无论如何都不会失败。有时很难判断它是否成功重用连接,因为服务器的性能非常不一致。但我喜欢它!!谢谢!!!!!!
    【解决方案2】:

    尽量不要打电话给connection.disconnect()...我认为你不需要这样做。但是,您应该确保在完成后关闭 reader

    【讨论】:

    • 这似乎不起作用。如果我不调用断开连接,当我尝试重新打开输出流时会出现错误(协议异常:读取输入后无法写入输出)。我还尝试仅重用输出流(不关闭它,也不再次从连接中请求它)......这不会导致错误,但似乎实际上并没有写任何东西(很难解释)。
    • @Doug:您是否尝试重用实际的HttpsURLConnection 对象?因为我认为你不应该那样做。我认为你应该每次都打电话给url.openConnection()...我很确定它可以处理为你保持实际连接打开的问题。
    猜你喜欢
    • 2015-09-23
    • 2013-05-05
    • 2014-08-14
    • 2019-12-05
    • 2020-08-24
    • 1970-01-01
    • 2016-02-08
    • 2013-08-15
    • 2018-06-13
    相关资源
    最近更新 更多