クライアント側でのセッションの扱いについてちょっと調べた。JDK1.5系で試した。 URLConnectionを使うサーバ側で「req.getSession(true);」されると、サーバ側はクライアント側に「Set-Cookie: JSESSIONID=XXXXX」という値を送り返してくる。受け取ったセッションIDをURLConnection経由でサーバへ送付するには以下のようにする。 - connection.setRequestProperty("Cookie", "JSESSIONID=" + jsessionId);
それを取得して以下のパターンをためす。 - Servlet1, Servlet2,別コンテキスト上のServlet3を用意
クライアント側のパターン - Servlet1へ一回目のリクエスト(JSESSIONIDはまだ受け取っていないため送れない)
- サーバ側で受けたHttpSessionRequestの状態は以下の通り。
- isRequestedSessionIdFromCookie()=false
- isRequestedSessionIdValid()=false
- getSession(false)=null
- サーバ側で「req.getSession(true);」すると、クライアント側へJSESSIONIDが返される。
- Servlet1へ二回目のリクエスト(JSESSIONIDは送らずにやってみる)
- サーバ側で受けたHttpSessionRequestの状態は以下の通り。
- isRequestedSessionIdFromCookie()=false
- isRequestedSessionIdValid()=false
- getSession(false)=null
- Servlet1へ三回目のリクエスト(一回目に受け取ったJSESSIONIDを送ってみる)
- サーバ側で受けたHttpSessionRequestの状態は以下の通り。
- isRequestedSessionIdFromCookie()=true
- isRequestedSessionIdValid()=true
- getSession(false)=not null
- サーバ側では当然セッションオブジェクトを取得できる。
- Servlet1へ四回目のリクエスト(でたらめなJSESSIONIDを送ってみる)
- サーバ側で受けたHttpSessionRequestの状態は以下の通り。
- isRequestedSessionIdFromCookie()=true
- isRequestedSessionIdValid()=false
- getSession(false)=null
- 別のサーブレットであるServlet2へのリクエスト(一回目にServlet1から受け取ったJSESSIONIDを送ってみる)
- サーバ側で受けたHttpSessionRequestの状態は以下の通り。
- isRequestedSessionIdFromCookie()=true
- isRequestedSessionIdValid()=true
- getSession(false)=not null
- サーバ側では当然セッションオブジェクトを取得できる。
- 別のコンテキスト上のServlet3へのリクエスト(一回目にServlet1から受け取ったJSESSIONIDを送ってみる)
- サーバ側で受けたHttpSessionRequestの状態は以下の通り。
- isRequestedSessionIdFromCookie()=true
- isRequestedSessionIdValid()=false
- getSession(false)=null
- コンテキストをまたげない。
commons-httpclientを使うHttpClient httpClient = new HttpClient(); httpClient.getHostConfiguration().setHost( new HttpHost("localhost", 8080, Protocol.getProtocol("http")));
...
PostMethod method = new PostMethod(); method.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); method.setPath(path); httpClient.getState().addCookie( new Cookie(httpClient.getHostConfiguration().getHost(), "JSESSIONID", jsessionId, path, null, false));
HttpClientのインスタンスを使い回せば、クッキーは保持してくれているようだ。 |