gpt4 book ai didi

java - useSystemProperties() 不适用于 Apache HttpClientBuilder.create() 版本 4.5.6

转载 作者:行者123 更新时间:2023-12-01 19:18:29 31 4
gpt4 key购买 nike

我有一个在 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();

请帮助了解如何继续...谢谢

最佳答案

经过一番调试,我发现如果我们设置connectionManager,调用useSystemProperties()不会有任何影响,在.build()函数中,有一个if检查连接管理器是否已设置的条件(引用下图),只有在未设置的情况下,才会使用 systemProperties(因为指定连接管理器是关于如何进行远程调用的低级自定义,我们应该在 PoolingHttpClientConnectionManager 初始化本身中进行设置)

PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new 
PoolingHttpClientConnectionManager(RegistryBuilder
.create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", SSLConnectionSocketFactory.getSystemSocketFactory())
.build());

SSLConnectionSocketFactory.getSystemSocketFactory()是最重要的

enter image description here

关于java - useSystemProperties() 不适用于 Apache HttpClientBuilder.create() 版本 4.5.6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59390226/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com