记一次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. Queue-jumpers - 平衡树

    题面 Ponyo and Garfield are waiting outside the box-office for their favorite movie. Because queuing i ...

  2. 记一次用arthas排查jvm中CPU占用过高问题

    记一次使用arthas排查jvm中CPU占用过高问题.这工具屌爆了 碾压我目前使用的全部JVM工具. 安装 小试 curl -O https://arthas.aliyun.com/arthas-bo ...

  3. grub2配置文件丢失如何修复

    实验操作准备 此步骤因实验需要所做,系统开机属grub界面无需此步! lsblk命令为了查看根分区挂载在什么位置 rm -rf /boot/grub2/grub.cfg命令为删除grub2配置文件到达 ...

  4. luogu P1488 肥猫的游戏

    肥猫的游戏 P1488 肥猫的游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 野猫与胖子,合起来简称肥猫,是一个班的同学,他们也都是数学高手,所以经常在一起讨论数学问 ...

  5. KingbaseES 并行查询

    背景:随着硬件技术的提升,磁盘的IO能力及CPU的运算能力都得到了极大的增强,如何充分利用硬件资源为运算加速,是数据库设计过程中必须考虑的问题.数据库是IO和CPU密集型的软件,大规模的数据访问需要大 ...

  6. 使用Dockfile构建mysql镜像与初始化运行mysql容器

    使用docker 构建mysql镜像,并在容器初次创建时初始化数据 Dockerfile FROM mysql:5.7.23 MAINTAINER gradyjiang "jiangzhon ...

  7. 聊聊两个Go即将过时的GC优化策略

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 这篇文章本来是要讲 Go Memory Ballast 以及 Go GC Tuner 来 ...

  8. 详谈 MySQL 8.0 原子 DDL 原理

    柯煜昌 青云科技研发顾问级工程师 目前从事 RadonDB 容器化研发,华中科技大学研究生毕业,有多年的数据库内核开发经验. 文章字数 3800+,阅读时间 15 分钟 背景 MySQL 5.7 的字 ...

  9. 7、System类

    System类 常见方法 exit 退出当前程序 System.out.println("ok1"); //1. exit(0) 表示程序退出 //2. 0 表示一个状态,正常的状 ...

  10. 5.云原生之Docker容器网络介绍与实践

    转载自:https://www.bilibili.com/read/cv15185166/?from=readlist 例如, 当在一台未经过特殊网络配置的centos 或 ubuntu机器上安装完d ...