URL-Rewriting問題

初回アクセス時になどで生成されるURLに"jsessionid="が付加されてしまう問題ですが、一応解決しました。Strutsタグのクラスを継承して独自タグを作りました。URL文字列をコンテキストに出力する部分をオーバーライドし、String#replaceAll(";jsessionid=.*(\\?|$)", "")しています。うーん、ad-hocだ。

色々調べた結果、javax.servlet.HttpServletResponse#encodeURL()が諸悪の根元のようです。このメソッドの中でCookieの有無を調べ、存在しない場合はURLにセッションIDを付加するという処理が行われています。

結局、「Cookieが送られてこなかったら、そのリクエストに対するレスポンスコンテンツに含まれるリンクにはセッションIDを付加することでセッションを維持しよう」というJava Servletの設計思想のせいです。たしかにCookieをサポートしないクライアント(携帯電話とか)に対しては有効な方法だとは思いますが、そのためにセッションIDが漏洩するリスクを抱えてしまっているわけで、どうも納得がいきませんね。少なくとも、URL-Rewritingをオフにする手段は提供してほしいものです。

ところで、";jsessionid=xxx"の先頭のセミコロンがずっと気になっていたのですが、HTTPのリクエストURL表記において、";"(セミコロン)で連結するのは"parameter"、"?"(クエスチョンマーク)で連結されるのは"query"と呼ぶのだそうですね。恥ずかしながら初めて知りました。

   http_URL = "http:" "//" host [ ":" port ] [ abs_path [ ";" parameter ] [ "?" query ]]

こんな感じですね。