Spring Boot 无效的cookie标头:无效的"expires"属性

hyrbngr7  于 2023-03-02  发布在  Spring
关注(0)|答案(1)|浏览(674)

我使用的是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规范提供程序,但默认值仍然应该开箱即用,或者?你认为呢?
先谢了

ilmyapht

ilmyapht1#

here的回答似乎可以接受。
即使它稍微涉及到其他方面,它也建议了一个相当可接受的解决方案:

HttpClient httpClient = HttpClients.custom()
    .setDefaultRequestConfig(RequestConfig.custom()
            .setCookieSpec(CookieSpecs.STANDARD).build())
    .build();

相关问题