在multiThreaded客户端中的每个请求上进行ssl握手

时间:2014-12-21 01:58:39

标签: java multithreading ssl apache-httpclient-4.x

架构是midTier Liberty服务器,它接收各种后端的http请求和代理,一些REST,一些只是JSON。当我配置SSL时(只通过envVars非常酷)...看来我得到一个完整的握手w /每个请求。另外,服务器端对每个请求使用不同的线程(可能是相关的)。这是Liberty,所​​以它是multiThreaded。 Servlet具有静态引用到POJO,它可以完成所有apache httpClient的工作。不使用HttpClientContext(在本例中)。基本流程结束(为后期合法性格式化而苦苦挣扎)

EnvVars:

-Djavax.net.ssl.keyStore=/root/lWasServers/certs/zosConnKey.jks
-Djavax.net.ssl.trustStore=/root/lWasServers/certs/zosConnTrust.jks
-Djavax.net.ssl.keyStorePassword=fredpwd
-Dhttp.maxConnections=40

看了很多类似的问题,但是现在这个流程并没有使用客户端上下文。希望我能错过一些简单的东西。代码被附加在第一个响应上,因为我继续在RHEL中使用FF。

private static PoolingHttpClientConnectionManager cm = null ;
private static CloseableHttpClient httpClient = null ;
// ....
cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(512);
cm.setDefaultMaxPerRoute(256) ;
httpClient = HttpClients.custom().setConnectionManager(cm).build() ;
// ...
responseBody = httpClient.execute(httpGet, responseHandler);

2 个答案:

答案 0 :(得分:0)

如果持久HTTP连接是有状态的并且与特定安全上下文或标识(例如SSL密钥或NTLM用户名)相关联,则HttpClient会尝试确保此连接不会在不同的安全上下文中被意外重用或通过不同的用户。通常,让HttpClient知道请求在逻辑上相关并属于同一会话的最直接的方法是使用相同的HttpContext实例执行这些请求。有关详细信息,请参阅HttpClient tutorial。如果HttpClient只能由单个用户访问或在同一安全上下文中,则还可以禁用连接状态跟踪。谨慎使用。

答案 1 :(得分:0)

好的,虽然我不是读ssl痕迹的专家,但我相信我已经解决了。我在线程但是由服务器控制。我现在传递HttpSession并保留对我现在为每个会话创建的HttpClientConnection的引用。我汇集了这些HttpClientConnection对象(基本池,基本上只是获取/释放)。因此,http会话中的所有调用都使用相同的HttpClientContext。现在看来我并不是一直在握手。可能有一种更好的方法可以做到这一点,但这确实有效,我有几个小问题需要研究(套接字超时时间<1毫秒?)......但我对自己有信心。 m不再与每个请求握手(每次我最终创建一个新的上下文)...所以这一切都很好。谢谢,