springboot 访问接口的A cookie header was received警告问题

Springboot 访问接口的A cookie header was received警告问题

1 警告信息

A cookie header was received [1686195932,1687937497; Hm_lpvt_fadc1bd5db1a1d6f581df60a1807f8ab=1687942021] that contained an invalid cookie. That cookie will be ignored.
 Note: further occurrences of this error will be logged at DEBUG level.

翻译

收到一个cookie头[1686195932,1687937497;Hm_lpvt_fadc1bd5db1a1d6f581df60a1807f8ab=1687942021]包含无效cookie。该cookie将被忽略。
注意:此错误的进一步发生将在DEBUG级别记录。

2 原因

问题就是从Tomcat 8Cookie的解析已经符合RFC 6265。由于RFC 6265不再接受以前允许的逗号分隔符(例如RFC 2109)。所以会将 "Cookie:KEY 1 = VAL 1,KEY 2 = VAL 2"的格式所以被视为非法。

RFC 2109

Cookie标头中的分隔符在任何地方都是分号(;)。服务器还应该接受逗号(,)作为cookie值之间的分隔符,以便将来兼容。

Cookie标头中的分隔符是分号(;)无处不在
服务器应该接受逗号和分隔符以向后兼容cookie值。

换句话说,RFC 2109中的"Cookie:KEY 1 = VAL 1,KEY 2 = VAL 2"正常。

RFC 6265

cookie-header ="Cookie:"OWS cookie-string OWS
cookie-string = cookie-pair *";"SP cookie对)

没有具体使用逗号作为分隔符的描述

Tomcat源码

org.apache.tomcat.util.http.parser.Cookie
public static void parseCookie(byte[] bytes, int offset, int len,
        ServerCookies serverCookies) {

    // ・・・略・・・

    // 使用RFC6265解析规则,检查报头是否以版本标记开始。
    // RFC2109版本标记可以使用RFC6265解析规则读取。
    // 如果是版本1,则使用RFC2109。否则使用RFC6265。

    skipLWS(bb);

    // ・・・略・・・
    if (skipResult != SkipResult.FOUND) {
        // No need to reset position since skipConstant() will have done it
        parseCookieRfc6265(bb, serverCookies);
        return;
    }

3 解决方案

(1) 将您的 cookie 更改为兼容的。
(2) 配置您的 Tomcat 以使用旧的 LegacyCookieProcessor。
(3) 停止升级。

参考文献

解决

使用传统Cookie处理器org.apache.tomcat.util.http.LegacyCookieProcessor。这是基于RFC 6265,RFC 2109RFC 2616的遗留cookie解析器。

LegacyCookieProcessor 实现了对cookie规范的严格解释。 由于与浏览器的各种互操作性问题并非都是严格的 默认情况下启用行为,并且可以使用其他选项 如果需要,进一步放宽此cookie处理器的行为。

@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> cookieProcessorCustomizer() {
   return tomcatServletWebServerFactory -> tomcatServletWebServerFactory.addContextCustomizers(
   	  (TomcatContextCustomizer) context -> { context.setCookieProcessor(new LegacyCookieProcessor());});
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot 跨域和 Session Cookie失效问题的解决方法如下: 首先,跨域问题可以通过配置Spring Boot的CORS(跨源资源共享)来解决。在Spring Boot中,可以使用注解 `@CrossOrigin` 或在配置类中添加 `addCorsMappings` 方法来配置跨域的访问。 @CrossOrigin 注解可以应用在控制器类或方法上,指定允许跨域的来源、方法、头部、是否允许携带凭证(比如 Cookie)等参数。例如: ```java @CrossOrigin(origins = "http://localhost:8080", maxAge = 3600, allowCredentials = "true") @GetMapping("/example") public ResponseEntity<String> getExample() { // ... } ``` 另一种配置跨域的方法是创建配置类,并继承 `WebMvcConfigurer` 接口,并重写其 `addCorsMappings` 方法。例如: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("http://localhost:8080") .allowedMethods("GET", "POST") .allowCredentials(true) .maxAge(3600); } } ``` 其次,Session Cookie失效问题可以通过在跨域请求中添加凭证(Credentials)来解决。具体来说,可以将 `allowCredentials` 参数设置为 `true`,同时在请求头中添加 `withCredentials: true`。例如: ```javascript fetch('http://localhost:8080/api/example', { method: 'GET', credentials: 'include' // 或 'same-origin' }) ``` 这样配置后,Spring Boot就可以正常接收带有 Cookie 的跨域请求,并在服务端保持 Session 的有效性。 综上所述,通过配置跨域设置和同时在请求中添加凭证,可以解决Spring Boot跨域和Session Cookie失效的问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值