我使用的是Spring boot 2.6.7的标准RestTemplate,它对应于org. apache. httpcomponents-〉httpclient-〉4. 5. 13。
调用一个公共API会导致日志中出现一些警告。日志记录器似乎来自apache的httpclient:org.apache.http.client.protocol.ResponseProcessCookies
警告为:
Invalid cookie header: "Set-Cookie: ts=foo; Path=/; Domain=paypal.com;
Expires=Sat, 21 Feb 2026 14:43:55 GMT; HttpOnly; Secure".
Invalid 'expires' attribute: Sat, 21 Feb 2026 14:43:55 GMT
我检查了apache http客户端的源代码:
- 拦截器
org.apache.http.client.protocol.RequestAddCookies
影响拦截器org.apache.http.client.protocol.ResponseProcessCookies
- 最后,一切都归结为使用
org.apache.http.impl.cookie.DefaultCookieSpec
- 它用
NetscapeDraftSpec.EXPIRES_PATTERN
示例化一个netscapeDraft
,也就是EEE, dd-MMM-yy HH:mm:ss z
- 因此,当
DefaultCookieSpec
看到属性expires
时,它会尝试通过上述模式对其进行解析,该模式是遗留的,并且失败(参见下面来自apache httpclient lib的屏幕截图):
我不明白为什么默认设置不足以有一个完全一致的日期能够正确解析。PATTERN_RFC1123 = "EEE, dd MMM yyyy HH:mm:ss zzz"
将与Sat, 21 Feb 2026 14:43:55 GMT
一起工作,但它不是默认使用的。为了使它工作,我必须显式地自定义cookie解析,这在我看来很难看:
new RestTemplateBuilder()
.requestFactory(() -> new HttpComponentsClientHttpRequestFactory(
HttpClientBuilder.create().setDefaultRequestConfig(RequestConfig.custom().setCookieSpec("fixPaypalExpires").build())
.setDefaultCookieSpecRegistry(CookieSpecRegistries.createDefaultBuilder()
.register("fixPaypalExpires",
new DefaultCookieSpecProvider(
CompatibilityLevel.DEFAULT,
PublicSuffixMatcherLoader.getDefault(),
new String[]{"EEE, dd MMM yyyy HH:mm:ss z"},
false))
.build())
.build()))
.build();
或者我可以使用一个预定义的cookie规范提供程序,但默认值仍然应该开箱即用,或者?你认为呢?
先谢了
1条答案
按热度按时间ilmyapht1#
here的回答似乎可以接受。
即使它稍微涉及到其他方面,它也建议了一个相当可接受的解决方案: