Cookie name "Path" is a reserved token
2017年11月17日 21時04分47秒
作成しているWebアプリケーションで、Cookieに使っちゃいけない名前が使われてるぞ!!というエラーが発生。
java.lang.IllegalArgumentException: Cookie name "Path" is a reserved token
こちらの記事(HTTP通信でのセッションIDのCookieにSecure属性を付ける)で書いたように、
セッションIDにSecure属性を持たせるようにした為、DefaultCookieSerializerでエラーになっていました。
調べてみると、org.springframework.session.web.http.DefaultCookieSerializer.readCookieValues()で、HttpServletRequest.getCookies()を実行していました。
CookieのKeyに「Path」や「Domain」等の予約語が使われていると、HttpServletRequest.getCookies()で上記のエラーが発生するようです。
対策方法をググってみましたが、そもそもCookieに予約語を指定しているのが問題というわけで解決方法見つからず。
しかし、エラーになられてもウザいので対策することに。
【対応方法】
これで、不正な名前のCookieがセットされたリクエストでも正常に動くようになりました。
java.lang.IllegalArgumentException: Cookie name "Path" is a reserved token
こちらの記事(HTTP通信でのセッションIDのCookieにSecure属性を付ける)で書いたように、
セッションIDにSecure属性を持たせるようにした為、DefaultCookieSerializerでエラーになっていました。
調べてみると、org.springframework.session.web.http.DefaultCookieSerializer.readCookieValues()で、HttpServletRequest.getCookies()を実行していました。
CookieのKeyに「Path」や「Domain」等の予約語が使われていると、HttpServletRequest.getCookies()で上記のエラーが発生するようです。
対策方法をググってみましたが、そもそもCookieに予約語を指定しているのが問題というわけで解決方法見つからず。
しかし、エラーになられてもウザいので対策することに。
【対応方法】
- DefaultCookieSerializerの中身を丸っとパクったクラスAを作成
- クラスA.readCookieValues()でgetCookies()を実行している部分の例外をキャッチ
- 例外が発生した場合はHttpServletRequest.getHeader("Cookie")で、ヘッダー内のクッキー情報を丸っと取得
- 丸っと取得したクッキー文字列を「;」と「=」でsplitして自前でクッキーを取得する処理を実装 ※ヘッダーは「c1=xxx; c2=xxx;」という感じになっているので、Keyの方はtrim()も実施
- DefaultCookieSerializerの代わりにクラスAをnewして使用する
これで、不正な名前のCookieがセットされたリクエストでも正常に動くようになりました。
PR
Comment