HttpServletRequest#isRequestedSessionIdFromCookie は初回アクセスのときは false を返す

JSESSIONID とか Cookie とか URL リライティングに関連する備忘録。
Servlet API 3.x の話です。

レガシーな Web アプリのちょっとしたリプレース中なんですが、携帯サイトがなくなったり、サイト自体が SSL アクセスされるようになったりしたので、セッション維持に使ってた JSESSIONID の URL リライティング (JSESSIONID を URL に埋め込むやつ) をやめて、Cookie のセッションIDが使われるように設定を変更しました。

web.xml に以下の設定を追加。

<session-config>
  <tracking-mode>COOKIE</tracking-mode>
</session-config>

しかし、初回アクセスかつリダイレクトが絡むようなケースの場合、なぜかリダイレクト先の URL に jsessionid パラメータが付与される...。で、調べてみたところアプリの中にこんなコードがありました。(抜粋)

boolean useCookie = request.isRequestedSessionIdFromCookie();
if (!useCookie) {
    // jsessionid を URL にくっ付ける処理
    // もともとは携帯サイト向けの処理
}

意図的に URL に jsessionid を付与してました。ただ、今回は Cookie を使うように設定しているため、useCookie は true となって if 文のブロックは実行されないはず。

どうやら、isRequestedSessionIdFromCookie() は、web.xml ではなくリクエストに Cookie が含まれているかどうかで判定しているっぽい。なので、初回アクセスの場合には false を返すわけですね。(たぶん)

というわけで、このあたりの処理は削除して解決。