报错信息:o.a.h.c.p.ResponseProcessCookies - Invalid cookie header: "Set-Cookie: account="xxxxx"; expires=Fri, 03 Feb 2023 06:02:40 GMT; httponly; Path=/". Invalid 'expires' attribute: Fri, 03 Feb 2023 06:02:40 GMT
httpClient版本:4.5.13
报错解析:
通过上面的报错信息,我们可以知道最后问题是出现在cookie的expires属性上,这个属性是代表着cookie存活时间,说的是这个字段属性无效。但在postman中,能正常的请求和保存cookie,那么问题肯定出现在解析代码中。
源码分析:
通过报错的类`ResponseProcessCookies`,直接打开源码找到打印报错日志的地方

从以上图片可以看出,发生错误的地方应该时在try里面,既然日志提示了是cookie构造失败,那么很明显应该就是cookieSpec.parse方法去构建cookie报错的
然而CookieSpec只是个接口,有多个实现,哪个出现的问题的,在不知道的情况下直接DEBUG查询,得知使用的是DefaultCookieSpec

一路DEBUG下去


到这里,区分是使用什么cookie属性处理器了,我们既然知道了expires属性有问题,直接进入BasicExpiresHandler

到这里很明显了,是关于cookie到期时间的格式有问题,请求中的格式`Fri, 03 Feb 2023 06:02:40 GMT` 即 EEE, dd MMM yy HH:mm:ss z,httpClient中解析的格式为`EEE, dd-MMM-yy HH:mm:ss z`,因请求中cookie到期时间的格式与解析的不符合导致的
找到的解决方案:
目前在网上看到两种
方案一:http://www.fullstackyang.com/httpclienthuo-qu-cookieji-chang-jian-cuo-wu-de-jie-jue-fang-fa/
方案二:https://blog.csdn.net/qq_32483145/article/details/88080453
方案一是自己手动写死处理到期时间的逻辑,个人觉得写法不太优雅
方案二则优雅一点修改解析格式(实际上方案二是写这篇博客时才看到的),但感觉拓展性不强
最终解决方案:
因为不是很喜欢上面两种方案,最终自己写了一个


直接自定义个MyDefaultCookieSpec去继承默认的DefaultCookieSpecProvider,所有实现全部使用父类的,就是在构造方法里加入自定义扩展的解析时间格式类型,这样有利于后续拓展
(自我感觉良好o.O)