记一次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<cookie接口>,泛型是接口导致无法使用redis反序列化,故需要进行转换操作。

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

存疑点:

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

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

记一次HTTPClient模拟登录获取Cookie的开发历程的更多相关文章

  1. Python入门小练习 003 利用cookielib模拟登录获取账户信息

    为了方便, 使用chinaunix的账户获取账户主题. 有些网站可能需要验证码,  找一些不用验证码的网站 下面 ****** 很多个星号的均为私密信息, 所以用星号代替 #!/usr/bin/pyt ...

  2. python模拟登录获取网站cookie

    因工作的需要需要使用某第三方网站页面的功能,但其网站未提供API,只有登录用户可使用该功能. 之前试过php使用snoopy获取set-cookie内容项进行手动拼装cookie,使用一段时间后发现网 ...

  3. php cUrl模拟登录,cookie保存到文件中

    源码如下: <?php header("Content-Type:text/html;charset=utf-8"); //模拟群友通讯录手机号登录 $curl = curl ...

  4. .Net HttpClient 模拟登录微信公众平台发送消息

    1.模拟登录 public WeiXinRetInfo ExecLogin(string name, string pass) { CookieContainer cc = new CookieCon ...

  5. C#模拟请求,模拟登录,Cookie设置、文件上传等问题汇总

    由于业务需求,最近需要模拟完成登陆某个网站,并上传所需要的文件.在开发途中,遇到了很多问题,现在,就我遇到的一些问题及解决办法说明如下,希望对遇到同样问题的人有所帮助.因为技术有限,可能有些内容并不完 ...

  6. ph模拟登录获取信息

    cURL 是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信 ...

  7. python利用selenium(webdriver chrome)模拟登陆获取cookie

    (我是在windows下进行实验的) 准备工作: 1.安装python环境. 2.python安装selenium插件(执行以下命令就行).   pip install selenium 3.Wind ...

  8. POST信息模拟登录获取页面内容

    最近项目里有一个是要模拟登录后,访问固定页面获取内容的要求,一开始用JQ AJAX好像不支持跨域请求.后使用.net中HttpWebRequest对象来获取.一开始访问总是无法在第二个页面正常访问,好 ...

  9. HttpClient 模拟登录网易微博

          实现核心:代码执行流程,根据抓包工具,模拟浏览器请求步骤走       private static void testLogin()       {             try    ...

随机推荐

  1. AtCoder Beginner Contest 254(D-E)

    Tasks - AtCoder Beginner Contest 254 D - Together Square 题意: 给定一个N,找出所有不超过N的 ( i , j ),使得( i * j )是一 ...

  2. 解决swiper组件autoplay报错问题

    最近在自定义一个swiper 插件 发现引用之后不定时一直在报错 Uncaught TypeError: Cannot read properties of undefined (reading 'a ...

  3. 【一月一本技术书】-【Go语言设计与实现】- 9月

    Go : 2009.11.10 代表作:Docker.k8s.etcd 模仿C语言,目标:互联网的C语言 讲的晦涩难懂....硬板..放弃了好几次才读完.满分10分,打6分. 下个月:Python数据 ...

  4. Chrome 浏览器缓存的问题

    浏览器缓存的问题 Chrome 在浏览器中设置: 1 Ctrl + Shift + Delete 2 Ctrl + F5 强制刷新 3 F12 打开控制台 ---> Network ---> ...

  5. 使用Docker方式部署Gitlab,Gitlab-Runner并使用Gitlab提供的CI/CD功能自动化构建SpringBoot项目

    1.Docker安装Gitlab,地址:https://www.cnblogs.com/sanduzxcvbnm/p/13814730.html 2.Docker安装Gitlab-runner,地址: ...

  6. Logstash:使用Logstash将电子邮件导入到Elasticsearch

  7. 在 Linux 中找出内存消耗最大的进程

    1 使用 ps 命令在 Linux 中查找内存消耗最大的进程 ps 命令用于报告当前进程的快照.ps 命令的意思是"进程状态".这是一个标准的 Linux 应用程序,用于查找有关在 ...

  8. MySQL学习(4)---MySQL索引

    ps:没有特殊说明,此随笔中默认采用innoDB存储引擎中的索引,且索引都是指B+树(多路平衡搜索树)结构组织的索引.其中聚集索引.复合索引.前缀索引.唯一索引默认都是使用B+树,统称为索引. 索引概 ...

  9. SECS半导体设备通讯-3 SECS-II通信标准

    一 SECS-II 概述 SECS-II 标准定义了使用如SECS-I.HSMS等传输协议在设备和主机之间交换的消息的形式和含义. 定义了以消息的形式在设备和主机之间传递信息,消息按其行为分类,称为S ...

  10. 新电脑搭建vue项目步凑

    电脑必备软件集合: Chrome,FF Nodejs VS code (ATOM...) GIT || SVN 插件类:postman 美术类:ps,pxcock等,自己喜欢的就行 翻译类:有道词典 ...