• 记一次HTTPClient模拟登录获取Cookie的开发历程


    记一次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然后存储到reids中,因为cookiestore中cookies的数据类型默认是LIst,泛型是接口导致无法使用redis反序列化,故需要进行转换操作。

    ​ 并且在编写代码过程中,list类型存储的cookes数据在使用GenericJasksonRedisSerializer在从redis中取出进行反序列化时仍旧会报错,无法转换,具体原因待分析,故将序列化改为GenericFastJsonRedisSerializer进行序列化,问题解决。

    存疑点:

    ​ 1.频繁使用cookie创建新的httpclient是否会影响性能?

    ​ 2.有没有使用唯一的一个httpclient每次去新的cookiestore的办法,类似于Token机制一样,只需要创建一个默认的httpclient即可,全局通过,无需频繁创建销毁httpclient。

  • 相关阅读:
    【图论】拓扑排序
    CountDownLatch翻车后,我建议用CompletableFuture改造下
    企业电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理
    数据结构与算法4-递归
    基于SpringBoot的精准扶贫管理系统
    类与对象(上)
    赴日开发工程师工作怎么找?
    排序算法性能王——快速排序
    神经网络推理速度的计算--GPU预热【附代码】
    Vue中 使用 Scss 实现配置、切换主题
  • 原文地址:https://www.cnblogs.com/codeHai/p/16877143.html