PoolingHttpClientConnectionManager:如何做Https请求?
我目前正在尝试使用CloseableHttpClient
同时执行多个HttpGet
请求。
我搜索了如何做到这一点,答案是使用PoolingHttpClientConnectionManager
。
此时我得到了这个:
PoolingHttpClientConnectionManager cManager = new PoolingHttpClientConnectionManager(); CloseableHttpClient httpClient = HttpClients.custom() .setConnectionManager(cManager) .build();
然后我尝试了http://www.google.com
的HttpGet
请求,一切正常。
然后我通过cmd创建了一个信任库并导入了目标网站的证书,用我的信任库设置了SSLConnectionSocketFactory
并设置了httpClient
的SSLSocketFactory
:
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream inputStream = new FileInputStream(new File("myTrustStore.truststore")); trustStore.load(inputStream, "nopassword".toCharArray()); inputStream.close(); SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore).build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); PoolingHttpClientConnectionManager cManager = new PoolingHttpClientConnectionManager(); CloseableHttpClient httpClient = HttpClients.custom() .setSSLSocketFactory(sslsf) .setConnectionManager(cManager) .build();
如果我尝试执行Https HttpGet
那么我会得到一个PKIX path building failed
exception。
如果我在没有.setConnectionManager(cManager)
情况下这样做,一切正常。
谁能告诉我如何让这个工作? (别担心,我不创建任何ddos工具)
提前致谢!
PS:我正在使用HttpComponents 4.3.1
找到答案: https : //stackoverflow.com/a/19950935/1223253
只需添加
Registry socketFactoryRegistry = RegistryBuilder. create().register("https", sslsf).build();
并将socketFactoryRegistry
作为参数传递给socketFactoryRegistry
的构造PoolingHttpClientConnectionManager
。 现在它工作得很好:)