搬運來源:https://blogs.yahoo.co.jp/dk521123/36721868.htmlhtml
緣由:
*從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.Cookieapache
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以下tomcat
<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處理器的行爲 若是須要。