【解决问题思路分析】记录hutool默认使用服务端上次返回cookie的问题解决思路

背景:

本服务需要调用第三方接口获取数据,首先调用public-key接口获取公钥,然后用公钥加密密码,将用户名和密码传入/ticket接口,获取Cookie和response body中的token。
请添加图片描述

排查思路

由于是调用第三方接口出现问题,第一步先拉通第三方对接人查看后台日志,对方使用apisix作为api网关,初步判断是对方有不同节点,负载均衡到不同节点而导致的偶发性问题。因此本地使用postman连续发起多次请求,经过50次请求后,每一次都能正确响应结果,此时可推测应该不是由于负载均衡不同节点导致的。

思路二:既然postman每次都能成功,业务系统却会偶发性,说明问题应该是出在本地代码。Debug本地调用流程以期望能够复现302问题,经过多次运行发现,第三方接口返回的cookie和token(下面将cookie和token统称为凭证)会存储在redis中。

代码中判断如果redis中没有凭证,则会重新获取并保存在redis中,如果redis中有凭证则从redis中获取。而redis中没有凭证时,调用第三方接口就获取凭证,再调用第三方业务接口时就一定会报错302,若直接从redis中获取凭证则不会有该问题。此时,可以复现302问题。

既然从redis中获取是正确的,而第一次请求过来就是302错误,我们对比两者的凭证,发现凭证时一模一样的。此时和对接人讨论,怀疑可能第是三方bug:在第一次请求时会查找本地缓存凭证,如果没有的话,则报错302,第二次就能在缓存中找到。为了验证该假设,我们用postman去做第一次调用,发现postman在第一次调用也是能够正常返回的,此时陷入僵局。

思路三:此时,想到通过wireShark抓包查看本地发出的请求有什么区别,但由于是https请求,却看不到header信息。

思路四:由于我们能准确复现302问题,我们再次拉通第三方,期望从对方日志中发现异常,从日志中发现,我们传过去的header中有两个cookie,但是我们代码中只传了一个cookie,此时推测可能是hutool在第一次获取服务端请求时把Cookie缓存起来,下次调用就默认带上Cookie。

HttpRequest req = HttpUtil.createRequest(Method.GET, url) .header("Content-Type", MediaType.APPLICATION_JSON_VALUE)  .header("Cookie", "Cookie")     .header("CSRFPreventionToken", "CSRFPreventionToken") .header("client_token", "client_token");
HttpResponse response =req.execute();

因此我们使用Apache来调用验证,发现Apache调用并不会出现302问题,此时可确认该问题是由于hutool工具会缓存Cookie,经过debug,发现确实会缓存到threadLocal中。最终,通过在调用/ticket接口并获取完数据后,加上下面一行代码解决。

HttpRequest.getCookieManager().getCookieStore().removeAll();

问题原因

hutool 自动保存了我们 /ticket 返回的 cookie,在这我们重新设置了一遍 token、cookie,导致重复了;然后为什么第二次访问没问题,第一次的request已经结束了,Cookie也就被清掉了,所以只有我们设置的token、Cookie。

总结

本次问题的解决最终找到hutool缓存上一次服务端返回的Cookie是不容易的,中间甚至还用抓包解决,这些解决思路值得记录。通过复盘分析, wireShark是个很好的定位问题工具,需要花点时间学习;开源包的issue是个解决问题的好思路,可以在上面搜索一下;当然还有复现问题,第三方协助,这些都很重要。

最后感谢自己,絮絮叨叨完成了博客,期待写出更多博客哦

参考博客

https://github.com/dromara/hutool/issues/583
https://blog.csdn.net/weixin_30315905/article/details/97599019

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Typora for Mac:优雅的Markdown文本编辑器,提升你的写作体验

Typora是一款强大的Markdown文本编辑器,专为Mac用户设计。无论你是写作爱好者,还是专业作家或博客作者,Typora都能为你提供无与伦比的写作体验。 1. 直观的界面设计 Typora的界面简洁明了,让你专注于写作,而不是被复…

BC v1.2充电规范

1 JEITA Reference to https://www.mianbaoban.cn/blog/post/169964 符合 JEITA 规范的锂离子电池充电器解决方案 2 Battery Fuel Gauge 2.1 Cycle Count(充放电循环次数) 此指令回传一只读字段,代表电芯组已经历的完整充放电循环数。当放电容…

【力扣】单调栈:901. 股票价格跨度

【力扣】单调栈:901. 股票价格跨度 文章目录 【力扣】单调栈:901. 股票价格跨度1. 题目介绍2. 思路3. 解题代码参考 1. 题目介绍 设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格…

PicGo+Gitee+Typora搭建云图床

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈,…

数据结构 堆——详细动画图解,形象理解

作者主页 📚lovewold少个r博客主页 ​➡️栈和队列博客传送门 🌳参天大树充满生命力,其根深叶茂,分枝扶疏,为我们展示了数据分治的生动形态 目录 🌳 树 树的常见概念 📒树的表示 二叉树 一…

探索乡村新风貌:VR全景记录乡村发展,助力乡村振兴

引言: 中国乡村正经历着巨大变革,长期以来,乡村地区一直面临着人口外流、资源匮乏等问题。然而,近年来,政府的政策支持以及新兴技术的崭露头角,如虚拟现实(VR)全景记录,…

随着 ChatGPT 凭借 GPT-4V(ision) 获得关注,多模态 AI 不断发展

原创 | 文 BFT机器人 在不断努力让人工智能更像人类的过程中,OpenAI的GPT模型不断突破界限GPT-4现在能够接受文本和图像的提示。 生成式人工智能中的多模态表示模型根据输入生成文本、图像或音频等各种输出的能力。这些模型经过特定数据的训练,学习底层模…

【photoshop学习】用 Photoshop 做的 15 件创意事

用 Photoshop 做的 15 件创意事 每个人总是谈论 Photoshop 的无限可能。您可以使用该程序做很多事情,列表几乎是无穷无尽的。 嘿,我是卡拉!如果您花过一些时间使用 在线ps,您可能见过我(并且注意到我提到了这一点&am…

WPF向Avalonia迁移(四、其他事项)

开发必备 1. Avalonia项目源代码!!!!!!!!!!没有源代码,你连控件的背景色怎么改都找不着!! 2.下载你所使用的版本&#x…

【AI视野·今日Robot 机器人论文速览 第五十一期】Tue, 10 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 10 Oct 2023 Totally 54 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers On Multi-Fidelity Impedance Tuning for Human-Robot Cooperative Manipulation Authors Ethan Lau, Vaibhav Srivastava, Sh…

【Proteus仿真】【STM32单片机】汽车倒车报警系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602液晶、按键、继电器电机模块、DS18B20温度传感器、蜂鸣器LED、HCSR04超声波等。 主要功能: 系统运行后,LCD1602显…

jmeter 请求发送加密参数

最近在做http加密接口,请求头的uid参数及body的请求json参数都经过加密再发送请求,加密方式为:ase256。所以,jmeter发送请求前也需要对uid及json参数进行加密。我这里是让开发写了个加密、解密的jar,jmeter直接调用这个…

Tomcat项目启动报错

java.io.IOException: java.lang.ClassCastException: Cannot cast org.springframework.web.SpringServletContainerInitializer to javax.servlet.ServletContainerInitializer解决办法:可能Tomcat版本不对,使用7.0.90版本启动报错,使用8.0…

【VTK】一文讲解vtkImageActor

很高兴在雪易的CSDN见到你,给你糖糖 系列文章目录 VTK付费专栏_雪易的博客-CSDN博客 感谢订阅的小哥哥小姐姐,小易会继续努力分享,一起进步! 若订阅后有其它需求,欢迎随时联系,CSDN一直在线(^U^)ノ~YO 前言 本文主要讲解vtk的

flutter 常用组件:文本、图片和按钮

文章目录 文本控件富文本控件图片本地图片网络图片按钮文本控件 ##一’码’当先 Text(这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本,textAlign:TextAlign.center,style: TextStyle(fontWeight: FontWeight.bold, font…

【日常】一名开发人员总结的好习惯,欢迎补充

文章目录 前言首先需要考虑(重要)设计和架构代码质量测试和调试性能优化 编程的好习惯代码可读性模块化和重用性单一职责异常处理注释和文档常见的Java编码规范的例子下面是一个示例代码,展示了一些编码规范的应用还有一些其他的编码规范值得…

计算机竞赛YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快,YOLOv6还没用熟YOLOv7就来了,如果有同学的毕设项目想用上最新的技术,不妨看看学长的这篇文章,学长带大家简单的…

2023年软考网工上半年下午真题

试题一: 阅读以下说明,回答问题1至问题4,将解答填入答题纸对应的解答栏内。 [说明] 某企业办公楼网络拓扑如图1-1所示。该网络中交换机Switch1-Switch 4均是二层设备,分布在办公楼的各层,上联采用干兆光纤。核心交换…

Jenkins对应java版本

官网地址:Java Support Policy 运行jenkins时,需要使用下列Java版本:

导致 JVM 内存泄露的 ThreadLocal 详解

为什么要有 ThreadLocal 当我们在学习JDBC时获取数据库连接时,每次CRUD的时候都需要再一次的获取连接对象,并把我们的sql交给连接对象实现操作。 在实际的工作中,我们不会每次执行 SQL 语句时临时去建立连接,而是会借助数据库连接…