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

这篇具有很好参考价值的文章主要介绍了【解决问题思路分析】记录hutool默认使用服务端上次返回cookie的问题解决思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:

本服务需要调用第三方接口获取数据,首先调用public-key接口获取公钥,然后用公钥加密密码,将用户名和密码传入/ticket接口,获取Cookie和response body中的token。
【解决问题思路分析】记录hutool默认使用服务端上次返回cookie的问题解决思路,开发语言,java,spring,intellij-idea

排查思路

由于是调用第三方接口出现问题,第一步先拉通第三方对接人查看后台日志,对方使用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文章来源地址https://www.toymoban.com/news/detail-726957.html

到了这里,关于【解决问题思路分析】记录hutool默认使用服务端上次返回cookie的问题解决思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (六)关于Linux中服务器磁盘爆满问题的几个解决思路

    在监控服务器性能的时候,发现服务器的磁盘占用很大,几乎快要爆满,具体的表现可能如下: 1、应用服务访问卡顿甚至失败; 2、数据库访问失败; 3、文件上传失败 等等 通过命令 df -h 查看磁盘占用情况,发现如下: 这里的占用是清除过的,所以并不算特别高。 这种现

    2024年02月04日
    浏览(51)
  • 项目启动 zookeeper 报错 java.net.ConnectException: Connection refused: no further information 解决问题思路分析

    项目启动不停的刷 java.net.ConnectException: Connection refused: no further information 链接被拒绝如下: 开始排查问题: 1.首先查看代码是不是有人提交了本地配置到仓库,导致自己配置文件无法读取到自己本地的配置文件,导致链接超时,链接不上zookeeper的服务 本地配置文件读取的还是本地的

    2024年02月16日
    浏览(45)
  • 【代码练习】旋转矩阵题解思路记录分析

    给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。 不占用额外内存空间能否做到? 示例 1: 给定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入矩阵,使其变为: [ [7,4,1], [8,5,2], [9,6,3] ] 示例 2: 给定 matrix = [ [ 5, 1, 9,11], [ 2,

    2024年02月08日
    浏览(59)
  • 分析Flink,源和算子并行度不一致时,运行一段时间后,看似不再继续消费的问题,提供解决思路。

    之前有分析过一次类似问题,最终结论是在keyby之后,其中有一个key数量特别庞大,导致对应的subtask压力过大,进而使得整个job不再继续运作。在这个问题解决之后,后续又再次出现了积压的情况,针对这个问题进行排查分析。 通过以下这张图,可以看到当前它是没有数据积

    2024年02月12日
    浏览(44)
  • cn.hutool.http.HttpException: Connection reset 问题解决

    项目A给项目B接口发送数据; 项目使用的是hutool的http工具类; 本地、测试环境均正常,生产出现了错误,明细: 生产环境接口测试没有问题; 在服务器同样可以ping通生产环境,排除白名单问题; 使用 timeout() 设置的超时时间,同样也记录了方法调用时间,均没有问题,并

    2024年02月13日
    浏览(49)
  • Gson 添加数据默认值问题记录

    问题:在用Gson add(key(string类型),value(必须是JsonElement子类))时发现,value 传了 \\\"\\\" 空字符串(非null),默认解析后返回null? 虽说影响不大、但是给后端传数据时、如果后端没有进行null处理 就会抛异常(而且后端懒得睬你、人家就是不愿意改...)0.0!!  1、问题代码

    2024年02月14日
    浏览(50)
  • 记录一次kafka内网向外网提供服务问题解决

    发现还是无法连接,当时考虑到与之前搭建复用的部分只有zk了,然后就重新搭建了一个单节点的zk,将kafka配置改为新搭建的单节点zk后,网络居然通啦,问题解决.

    2024年02月10日
    浏览(63)
  • 404:源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示的问题解决思路

    今天把一个尘封已久的项目拿出来跑发现访问其中一个静态页面的时候显示如下错误: 先开始我想的是不是路径写错了,但是经过排查发现不是。然后查了一堆资料也没有解决。最后发现是静态资源映射的代码被我注释掉了,直接裂开: 接下来就说说这种问题的两种解决思

    2024年02月06日
    浏览(44)
  • Linux服务器CPU使用率过高排查与解决思路

    日常工作中有时候会遇到Linux服务器上出现CPU负载过高的情况,影响程序的运行,一般的排除思路如下: 然后按shift+p按照CPU排序,找到占用CPU过高的进程的pid 找到进程中消耗资源最高的线程的id 将需要的线程ID转换为16进制格式 bc是linux的计算器命令 查看线程状态信息 grep

    2024年01月21日
    浏览(50)
  • 亚马逊云服务器aws ssh无法登录的解决问题记录

    一、涉及命令 二、AWS亚马逊云EC2服务器使用Root登录方法(在debian系统上操作成功) 三、SSH密钥丢失,更换密钥方法 解决连接到 EC2 实例时的“服务器拒绝我们的密钥”错误 四、可疑方法 1、将具有 SSH 访问权限的新用户账户添加到 Amazon EC2 Linux 实例 2、使用 EC2 串行控制台

    2024年02月06日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包