记一次HTTPClient模拟登录获取Cookie的开发历程
环境:
springboot : 2.7
jdk: 1.8
httpClient : 4.5.13
设计方案
通过新建一个空的cookie库创建出一个Http客户端,然后通过此客户端调用登录接口模拟登录拿到cookie数据,登录成功 cookie会自动存储到我们之前新建的空cookie库中,将此cookie库保存下来,后续其他接口调用每次都通过这个登录成功的cookie库创建出新的http客户端来发起http访问。
代码实现:
/** * 每个cookie只能绑定一个客户端,提供这个方法用于给cookie生成http客户端 * * @param basicCookieStore: cookie * @Author: sanghaiquan * @Date: 2022/11/9 10:45 * @return: org.apache.http.impl.client.CloseableHttpClient **/ private static CloseableHttpClient getHttpsClient(BasicCookieStore basicCookieStore) throws KeyManagementException, NoSuchAlgorithmException { CloseableHttpClient httpClient = null; SSLContext sslContext = SSLContext.getInstance("TLS"); X509TrustManager x509TrustManager = new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return null; } }; sslContext.init(null, new TrustManager[]{x509TrustManager}, null); SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory( sslContext, new String[]{"SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"}, null, NoopHostnameVerifier.INSTANCE ); httpClient = HttpClients.custom() // 设置跳过SSL认证 .setSSLSocketFactory(sslConnectionSocketFactory) // 设置客户端默认的cookie .setDefaultCookieStore(basicCookieStore) // 每个route默认的最大连接数 .setMaxConnPerRoute(100) // 总的连接池最大连接数 .setMaxConnTotal(500) .build(); return httpClient; }
问题记录:
获取到的cookiestore由于内部结构原因,无法被redis正常反序列化,如果需要将cookie持久化存储,那么就需要将cookiestore中的cookiesGet获取出来,并转换成list
并且在编写代码过程中,list
存疑点:
1.频繁使用cookie创建新的httpclient是否会影响性能?
2.有没有使用唯一的一个httpclient每次去新的cookiestore的办法,类似于Token机制一样,只需要创建一个默认的httpclient即可,全局通过,无需频繁创建销毁httpclient。