Cookie の JSESSIONID と URL の jsessionid= どちらが優先されるか。

  • お題 : 「Tomcat 6.0.x で Cookie の JSESSIONID と URL の jssesionid= どちらが優先されるか。」

表題の通りで、URL に jsessionid つけていて、なおかつ Cookie から JSESSIONID が送られてくる場合にどちらが優先されるか、というお話。正解は Cookie (これ、皆さんご存知のお話でしたらお恥ずかしい。。)。 Tomcat 6.0.20 の CoyoteAdapter#postParseRequest を眺めてると、parseSessionId というメソッドで URL パラメータ処理をした後、メソッドの最後に parseSessionCookiesId で上書きしてます。

確かめるのも簡単で、実際に二つのブラウザ (A,B) を立ち上げて sessionId 生成させて、以下のような jsp で互い違いにアクセスすれば分かるデス。

session id is <%=session.getId()%>
<ul>
<li><a href="${contextPath}/;jsessionid=AのセッションID">A jsession id</a></li>
<li><a href="${contextPath}/;jsessionid=BのセッションID">B jsession id</a></li>
</ul>

背景としては、携帯サイトなどで、jsessionid つけてセッションコントロールしていたアプリが、何故かセッションを引き継げない、というケースで予測していなかった Cookie 送られてきてるカモねー、という話。

余談 :

このあたり をみていると、apache の mod_proxy_balancer を利用するときの stickysession の値の大文字/小文字の問題が指摘されてますが、Globals を見ると、以下のようになっていて、システムプロパティで上書き出来るようになった模様。

    /**
     * The name of the cookie used to pass the session identifier back
     * and forth with the client.
     */
    public static final String SESSION_COOKIE_NAME =
        System.getProperty("org.apache.catalina.SESSION_COOKIE_NAME",
                "JSESSIONID");


    /**
     * The name of the path parameter used to pass the session identifier
     * back and forth with the client.
     */
    public static final String SESSION_PARAMETER_NAME =
        System.getProperty("org.apache.catalina.SESSION_PARAMETER_NAME",
                "jsessionid");