Cosminexus 機能解説
ここでは,セッションの管理方法について説明します。
Webコンテナでのセッションの管理方法には,HTTP Cookieを使用する方法と,URL書き換えを使用する方法の2種類があります。
Webコンテナは,セッションがどの方法で管理されているかを,セッションIDが何から取得できたかによって判別します。HTTP CookieからセッションIDを取得した場合は,HTTP Cookieによってセッションを管理していると判別します。URLのパスパラメタから取得できた場合は,URL書き換えによってセッションを管理していると判別します。これらの判別は,リクエストごとに実行されます。
次に,セッションの管理方法ごとのセッションIDの管理のされ方について説明します。
セッションIDは,HTTP Cookieとして管理されます。
セッションIDを示すHTTP Cookieの名称は,「JSESSIONID」です。この名称は,Servlet仕様で決められているため,変更できません。
セッションIDは,URLのパスパラメタとして管理されます。
セッションIDを示すURLのパスパラメタの名称は,「jsessionid」です。この名称は,Servlet仕様で決められているため,変更できません。セッションIDは,WebコンテナによってURLが書き換えられるときに,URLのパスの最後に,「;jsessionid=セッションID」の形式で付加されます。
URLのパスは,階層構造を持っている,リソースを識別するための値です。URLのパスには,クエリやフラグメントは含まれません。このため,これらの要素がURLに含まれている場合,セッションIDは,クエリまたはフラグメントの直前に付加されます。また,URLにセッションID以外のパスパラメタが含まれている場合,セッションIDを示すパスパラメタは,URLに含まれるパスパラメタの最後に付加されます。
表4-9 URL書き換えによって増加するURLの文字数
機能の使用状況 | 増加するURLの文字数(単位:文字数) |
---|---|
リダイレクタによる負荷分散機能またはサーバID付加機能を使用していない場合 | 44※ |
リダイレクタによる負荷分散機能を使用している場合 | 44※ + 1(ピリオドの文字数)+ワーカ名の文字数 |
サーバID付加機能を使用している場合(リダイレクタによる負荷分散機能を使用していないとき) | 44※ + サーバIDの文字数 |
URL書き換えは,J2EEアプリケーション内でURL書き換えを実行するServlet APIを呼び出したときに実行されます。
URL書き換えを実行するServlet APIとは,次に示すjavax.servlet.http.HttpServletResponseインタフェースのメソッドです。
これらのメソッドの詳細については,Servlet仕様を参照してください。なお,encodeUrl(java.lang.String url)メソッド,およびencodeRedirectUrl(java.lang.String url)メソッドは,Servlet 2.1以降,非推奨のAPIとなっています。このため,これら以外のメソッドを使用することをお勧めします。
ここでは,Servlet仕様で明記されていないAPIの動作として,URL書き換えを実行するServlet APIの戻り値についての,Cosminexusでの動作について説明します。
HTTPセッションは,リクエスト処理中のWebアプリケーション内だけで有効です。このため,Servlet APIの引数に指定されたURLが,リクエスト処理中のWebアプリケーション内を指しているURLの場合にだけ,URL書き換えをします。引数のURLごとに,リクエスト処理中のWebアプリケーション内を指していると判定する条件を次の表に示します。
表4-10 引数のURLごとに,リクエスト処理中のWebアプリケーション内を指していると判定する条件
引数のURLの種類 | 判定条件 |
---|---|
相対URL ((例)/ex/a.html) |
次の条件を満たす場合にだけ,Webアプリケーション内であると判定されます。
|
絶対URL ((例)http://host1/ex/) |
次のすべての条件を満たす場合にだけ,Webアプリケーション内であると判定されます。
|
注※1 名称を比較する場合に,大文字,小文字を区別します。
注※2 名称を比較する場合に,大文字,小文字を区別しません。
注※3 リクエストのホスト名は,リクエストのHostヘッダのホスト名部分とし,ホスト名の名前解決しないで,文字列を比較します。なお,リクエストのホスト名には,javax.servlet.ServletRequest.getServerNameメソッドの戻り値を使用します。なお,次の場合は,同じホストであっても異なるホストと判定します。
また,URL書き換えを実行するServlet APIの引数に,URL以外の文字列を指定した場合の戻り値について説明します。また,URLの先頭にクエリまたはフラグメントを指定した場合についても,あわせて説明します。
URL書き換えを実行するServlet APIの引数ごとの戻り値を次の表に示します。
表4-11 URL書き換えを実行するServlet APIの引数ごとの戻り値
項番 | 条件 | 戻り値または発生する例外 | |
---|---|---|---|
HTTPセッション | 引数 | ||
1 | − | null | nullが返されます。 |
2 | − | URLとして不正なフォーマット | java.lang.IllegalArgumentException例外が発生します。 |
3 |
|
空文字列 | HTTPリクエストのURLのパスおよびクエリに対して,セッションIDを付加した値が返されます。※1 |
4 | クエリから開始されているURL(先頭文字が「?」の場合) | HTTPリクエストのURLのパスに,セッションIDおよび引数に指定した値が付加された値が返されます。※1 | |
5 | フラグメントから開始されているURL(先頭文字が「#」の場合) | 引数に指定した値が返されます。※2 | |
6 | 現在のHTTPセッションのセッションIDを表すパスパラメタが含まれているURL | 引数に指定した値が返されます。 | |
7 | リクエスト処理中のWebアプリケーション内と判定されるURL | 引数にセッションIDを付加した値が返されます。 | |
8 | 上記の条件以外 | 引数に指定した値が返されます。 |
(凡例)−:該当しない
次に,URL書き換えを使用してセッションIDを付加したURLの例について説明します。なお,ここで説明する例は,次の前提条件に従っています。
URL書き換えに使用するServlet APIの引数の指定値と書き換え後の戻り値(URL)の対応の例を次の表に示します。
表4-12 URL書き換えに使用するServlet APIの引数の指定値と書き換え後の戻り値(URL)の対応の例
Servlet APIの引数 | 戻り値 |
---|---|
b.html | b.html;jsessionid=AAAAA111112222233333444445555566svr0 |
../b.html | ../b.html;jsessionid=AAAAA111112222233333444445555566svr0 |
../../b.html | ../../b.html |
http://host2/ | http://host2 |
https://host1/gyoumu1/ | https://host1/gyoumu1/;jsessionid=AAAAA111112222233333444445555566svr0 |
""(空文字列) | "/gyoumu1/app1/index.jsp;jsessionid=AAAAA111112222233333444445555566svr0?type=1" |
"?mode=2" | "/gyoumu1/app1/index.jsp;jsessionid=AAAAA111112222233333444445555566svr0?mode=2" |
"#aaa" | "#aaa" |
URL書き換えを使用する場合の注意事項について説明します。
静的コンテンツ(HTMLファイルなど)から遷移した場合,URL書き換えによって管理されているセッションは維持されません。
URL書き換えを使用してセッションを管理する場合は,常にサーブレットまたはJSPを使用して画面を遷移するように実装してください。また,サーブレットまたはJSP内で,Servlet APIによってURLを書き換えて,セッションIDを追加する処理を実装してください。
HTTPリクエストのURLに,URL書き換えによって追加されたセッションIDを示すパスパラメタが含まれる場合であっても,次のメソッドによって取得したURLには,セッションIDを示すパスパラメタは含まれません。
All Rights Reserved. Copyright (C) 2006, 2007, Hitachi, Ltd.