hutool中httpUtil设置cookie的问题

前言

最近再项目上遇到了一个奇怪的问题,项目中前端页面是h5形式嵌入再第三方的小程序里,登录时将第三方token给到后台,后台调用第三方的获取用户信息接口,传递一个token,放在cookie里,今天客户反馈登录不上了,我查看了日志发现前端传递给后台的token没问题,但是第三方返回token失效且返回的token并不是我传递的token,第一感觉难道是第三方系统的问题,但是通过postman调用第三方那个接口发现没有问题,怀疑难道是缓存的问题,我重启了下服务,果真好了,但是没有解决根本问题,下午客户又反馈登录不上了,这次我好好看了下日志,下面记录下解决问题的过程!

发现问题

日志中打印了调用了线程名称,一开始启动后没有问题,反复的登录N次后就出现了问题,日志中的线程名称类似如下

1
2
3
2022-09-29 22:23:39.134 [http-nio-8087-exec-5]
2022-09-29 22:23:44.739 [http-nio-8087-exec-6]
2022-09-29 22:23:44.739 [http-nio-8087-exec-7]

我反复查看了日志,比如第一次我用线程5登录成功了,1个小时后token失效了,换了新的token,这次又命中了线程5去登录,第三方返回token无效且token并不是我传递的新token,发现返回的token是线程5上次获取到的token,那问题就很明了了,就是cookie传递的不对,我用的hutool的httputil工具类,关键代码如下

1
HttpResponse cookie = HttpUtil.createGet("https://www.test.com/login").header("Cookie", "token=12345").execute();

我用的header设置的cookie,我想难道是这里的问题?为了复现这个问题,我把tomcat的线程设置成1个

1
server.tomcat.threads.max=1

启动后第一次登录无问题,第二次登录返回无效,token果真是上次的token,看来不能让第三方背锅了

解决

然后看了下hutool的方法,如果不设置cookie,那默认每次都是取上次设置的cookie,因为第三方的接口不管成功失败,都在响应头里返回我传递的那个cookie,间接导致了这个问题!因为我设置cookie一开始用的header去设置的,但是hutool应该是最后请求时会默认再用cookie覆盖一遍,所以就导致了cookie设置无效,改用cookie设置后就好了,源码中注释也提示了如果不设置就会用默认行为,设置了就会覆盖

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 设置Cookie<br>
* 自定义Cookie后会覆盖Hutool的默认Cookie行为
*
* @param cookie Cookie值,如果为{@code null}则设置无效,使用默认Cookie行为
* @return this
* @since 3.0.7
*/
public HttpRequest cookie(String cookie) {
this.cookie = cookie;
return this;
}
总结

如果要设置cookie,就一定要用cookie的方法去设置,不要用header,否则就会出现类似的问题