Tomcat:A cookie header was received[xxxxxx] that contained an invalid cookie. That cookie will be ignored.


搬運來源:https://blogs.yahoo.co.jp/dk521123/36721868.html

原因:

 *從Tomcat 8,Cookie的解析已經符合RFC 6265。
 *由於RFC 6265不再接受以前允許的逗號分隔符(例如RFC 2109)
 "Cookie:KEY 1 = VAL 1,KEY 2 = VAL 2"的格式被視為非法

發生過程:

*客戶端(Java)
   |
  HTTPS
 負載均衡器/粘性會話
   |
  HTTP
 * Apache(v 2.4.6)*也發生在2.2.31版本中
   |
  AJP 1.3
 * Tomcat(v8.5.11)
 * Web服務(Java)

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) {

    // ・・・略・・・

    // Using RFC6265 parsing rules, check to see if the header starts with a
    // version marker. An RFC2109 version marker may be read using RFC6265
    // parsing rules. If version 1, use RFC2109. Else use RFC6265.

    skipLWS(bb);

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

解決方法:

舊版中,修改${catalina.home}/conf/server.xml如下

   <CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor"/>
</Context>

Tomcat8/9修改context.xml如下

   <CookieProcessor className ="org.apache.tomcat.util.http.LegacyCookieProcessor"/>
</Context>

 

 參考資料:

https://tomcat.apache.org/tomcat-8.5-doc/config/cookie-processor.html

更多摘錄

傳統Cookie處理器 -  org.apache.tomcat.util.http.LegacyCookieProcessor

這是基於RFC 6265,RFC 2109和RFC 2616的遺留cookie解析器。
它實現了對cookie規范的嚴格解釋。
由於瀏覽器的各種互操作性問題,並不是所有嚴格的行為都被啟用
 默認情況下,還有其他選項可用於進一步放松此cookie處理器的行為
 如果需要。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM