java - useSystemProperties() 不适用于 Apache HttpClientBuilder.create() 版本 4.5.6
问题描述
我有一个在 Vanilla Spring 4.2.5.RELEASE 和 JDK 1.7 上运行的项目,它使用 RestTemplate 和 PoolingHttpClientConnectionManager,我已经初始化客户端以使用系统属性
private HttpClient httpClient() {
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();
poolingHttpClientConnectionManager.setMaxTotal(300);
poolingHttpClientConnectionManager.setDefaultMaxPerRoute(200);
return HttpClientBuilder
.create()
.useSystemProperties()
.setConnectionManager(poolingHttpClientConnectionManager)
.build();
}
并设置以下系统属性-Dhttps.protocols=TLSv1.2
我对这种行为一无所知,我尝试过创建SSLConnectionSocketFactory
这样的自定义并且它有效
SSLConnectionSocketFactory sslConnectionSocketFactory =
new SSLConnectionSocketFactory(SSLContexts.createDefault(),
new String[]{"TLSv1.2"},
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager =
new PoolingHttpClientConnectionManager(
RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", sslConnectionSocketFactory)
.build());
但我还有一个问题要解决,即 https 调用的 trustStore,此应用程序部署在 IBM WebSphere 中,由于 httpClient 没有使用 WebSphere 服务器设置的 systemProperties,我应该添加另一个代码片段(指向 IBM TrustStore),我不想这样做,因为它的工作量太大,理想情况下 useSystemProperties() 应该解决这两个问题......
SSLContext sslContext = SSLContexts
.custom()
.loadKeyMaterial(ResourceUtils.getFile(keystoreLocation), null, keystorePassword.toCharArray())
.loadTrustMaterial(ResourceUtils.getFile((truststoreLocation)), truststorePassword.toCharArray())
.build();
请帮助如何进行...谢谢
解决方案
经过调试发现,useSystemProperties()
如果我们设置connectionManager,调用不会有任何影响,在.build()
函数中,有一个if条件来检查connectionManager是否设置(参考下图),只有没有设置时才会使用systemProperties(因为指定连接管理器是关于如何进行远程调用的低级自定义,我们应该在 PoolingHttpClientConnectionManager 初始化本身中设置它)
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new
PoolingHttpClientConnectionManager(RegistryBuilder
.create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", SSLConnectionSocketFactory.getSystemSocketFactory())
.build());
SSLConnectionSocketFactory.getSystemSocketFactory()
是最重要的
推荐阅读
- java - 将参数传递给 gradle 构建脚本
- php - 不按应有的方式将数据插入数据库
- python - 是否可以使用 NumPy 或 Python 中的其他包获得保留的特殊数量的双精度二进制浮点数
- java - 来自 java 的存储过程调用抛出“游标状态无效”错误
- jquery - jQuery File Upload blueimpl 浏览器冻结
- python - 如何在 wxpython 上实现图像?
- javascript - 如何解决 Safari 上 angularjs 的问题?
- android - RxBinding 或 RxAndroid
- wordpress - 如何在特定页面上显示运输方式选择?
- c# - 如何在同一端口上运行带有 .net framework 4.7.1 WebAPI 的 Angular Web 应用程序?