Cookie の JSESSIONID と URL の jsessionid= どちらが優先されるか。
表題の通りで、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");