Cosminexus V9 アプリケーションサーバ 機能解説 基本・開発編(Webコンテナ)

[目次][用語][索引][前へ][次へ]

2.7.9 セッション管理の注意事項

セッション管理の注意事項について説明します。

<この項の構成>
(1) セッションパラメタのカスタマイズと注意事項
(2) URL書き換えをする場合に使用するAPIと注意事項
(3) URL書き換えを使用する場合の注意事項
(4) セッションの管理に使用するHTTP CookieのSecure属性

(1) セッションパラメタのカスタマイズと注意事項

HTTP Cookieの名称,およびURLのパスパラメタ名は,次の設定で変更できます。

簡易構築定義ファイルのwebserver.session.cookie_config.nameパラメタがtrueで,指定したHTTP Cookieの名称,およびURLのパスパラメタ名とサーバIDのCookieの付加機能で指定したCookieの名称が重複した場合,次のように動作します。

簡易構築定義ファイルのwebserver.session.cookie_config.nameパラメタで指定した名称と重複した場合
デフォルトのセッションIDが設定されます。HTTP Cookieのときは「JSESSIONID」となります。URLのパスパラメタのときは「jsessionid」となります。

cosminexus.xml,web.xml,またはServlet APIで指定した名称と重複した場合
Webアプリケーションの開始時にKDJE39338-Eが出力され,開始に失敗します。Webアプリケーションのリロード処理の実行時はKDJE39338-Eが出力され,リロード処理が続行されます。リロード処理中にKDJE39338-Eが出力された場合は,Servlet APIを使用してCookieの名前を変更したファイルを修正してから,再度リロード処理を実行してください。

(2) URL書き換えをする場合に使用するAPIと注意事項

URL書き換えは,J2EEアプリケーション内でURL書き換えを実行するServlet APIを呼び出したときに実行されます。

これらのメソッドの詳細については,Servlet仕様を参照してください。なお,encodeUrl(java.lang.String url)メソッド,およびencodeRedirectUrl(java.lang.String url)メソッドは,Servlet 2.1以降,非推奨のAPIとなっています。このため,これら以外のメソッドを使用することをお勧めします。

ここでは,Servlet仕様で明記されていないAPIの動作として,URL書き換えを実行するServlet APIの戻り値についての,アプリケーションサーバでの動作について説明します。

HTTPセッションは,リクエスト処理中のWebアプリケーション内だけで有効です。このため,Servlet APIの引数に指定されたURLが,リクエスト処理中のWebアプリケーション内を指しているURLの場合にだけ,URL書き換えをします。引数のURLごとに,リクエスト処理中のWebアプリケーション内を指していると判定する条件を次の表に示します。

表2-31 引数のURLごとに,リクエスト処理中のWebアプリケーション内を指していると判定する条件

引数のURLの種類 判定条件
相対URL
((例)/ex/a.html)
次の条件を満たす場合にだけ,Webアプリケーション内であると判定されます。
  • 引数のURLの正規化したパスが,リクエスト処理中のWebアプリケーションのコンテキストルート名を含んでいる。※1
絶対URL
((例)http://host1/ex/)
次のすべての条件を満たす場合にだけ,Webアプリケーション内であると判定されます。
  • 引数のURLのスキームが「http」,または「https」である。※2
  • 引数のURLとリクエストのURLが同一のスキームの場合,ポート番号が一致する。
  • 引数のURLのホスト名が,リクエストのホスト名と一致する。※1※3
  • 引数のURLの正規化したパスが,リクエスト処理中のWebアプリケーションのコンテキストルート名を含んでいる。※1

注※1 名称を比較する場合に,大文字,小文字を区別します。

注※2 名称を比較する場合に,大文字,小文字を区別しません。

注※3 リクエストのホスト名は,リクエストのHostヘッダのホスト名部分とし,ホスト名の名前解決しないで,文字列を比較します。なお,リクエストのホスト名には,javax.servlet.ServletRequest.getServerNameメソッドの戻り値を使用します。なお,次の場合は,同じホストであっても異なるホストと判定します。


また,URL書き換えを実行するServlet APIの引数に,URL以外の文字列を指定した場合の戻り値について説明します。また,URLの先頭にクエリまたはフラグメントを指定した場合についても,あわせて説明します。

URL書き換えを実行するServlet APIの引数ごとの戻り値を次の表に示します。

表2-32 URL書き換えを実行するServlet APIの引数ごとの戻り値

項番 条件 戻り値または発生する例外
HTTPセッション 引数
1 null nullが返されます。
2 URLとして不正なフォーマット java.lang.IllegalArgumentException例外が発生します。
3
  • リクエスト処理中に新規作成したHTTPセッションがある。
  • URL書き換えでセッションIDが通知されている。
空文字列 HTTPリクエストのURLのパスおよびクエリに対して,セッションIDを付加した値が返されます。※1
4 クエリから開始されているURL(先頭文字が「?」の場合) HTTPリクエストのURLのパスに,セッションIDおよび引数に指定した値が付加された値が返されます。※1
5 フラグメントから開始されているURL(先頭文字が「#」の場合) 引数に指定した値が返されます。※2
6 現在のHTTPセッションのセッションIDを表すパスパラメタが含まれているURL 引数に指定した値が返されます。
7 リクエスト処理中のWebアプリケーション内と判定されるURL 引数にセッションIDを付加した値が返されます。
8 上記の条件以外 引数に指定した値が返されます。

(凡例)−:該当しない

この表で示す項番は,条件の優先度を示します。項番の数字が小さいほど,条件の優先度は高くなります。

注※1
引数のURLにパスが含まれないため,引数のURLにパスパラメタを直接付加できません。引数が空文字列やクエリから始まるURLは,リクエストのURLのリソースを指しているURLであるため,リクエストのURLにパスパラメタを付加した値を使用して,URL書き換えをします。

注※2
フラグメントだけのURLは,現在のリソース内の特定の個所を示すURLです。Webブラウザでは,通常このURLを,表示されているコンテンツ内の移動を示すものとして扱います。このとき,サーバにリクエストは送信しません。なお,これは,RFC3986に従った動作です。

次に,URL書き換えを使用してセッションIDを付加したURLの例について説明します。なお,ここで説明する例は,次の前提条件に従っています。

前提条件
  • Servlet APIは,HTTPセッションの生成後に実行されたものとします。
  • HTTPリクエストのURLは,「http://host1/gyoumu1/app1/index.jsp?type=1」です。
  • コンテキストルート名は,「/gyoumu1」です。

URL書き換えに使用するServlet APIの引数の指定値と書き換え後の戻り値(URL)の対応の例を次の表に示します。

表2-33 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"

(3) URL書き換えを使用する場合の注意事項

URL書き換えを使用する場合の注意事項について説明します。

●静的コンテンツからの画面遷移

静的コンテンツ(HTMLファイルなど)から遷移した場合,URL書き換えによって管理されているセッションは維持されません。

URL書き換えを使用してセッションを管理する場合は,常にサーブレットまたはJSPを使用して画面を遷移するように実装してください。また,サーブレットまたはJSP内で,Servlet APIによってURLを書き換えて,セッションIDを追加する処理を実装してください。

●Webアプリケーションで取得したリクエストURL

HTTPリクエストのURLに,URL書き換えによって追加されたセッションIDを示すパスパラメタが含まれる場合であっても,次のメソッドによって取得したURLには,セッションIDを示すパスパラメタは含まれません。

インタフェース
javax.servlet.http.HttpServletRequestインタフェース

メソッド
  • getRequestURI()メソッド
  • getRequestURL()メソッド

(4) セッションの管理に使用するHTTP CookieのSecure属性

HTTPリクエストをHTTPSプロトコルで送信した場合に,Webコンテナが生成したセッションIDがHTTP Cookieによってクライアントに返されます。そのとき,HTTP CookieにSecure属性が付与されます。

また,ゲートウェイ指定機能でスキームをHTTPSと見なすように設定している場合に,Webコンテナが生成したセッションIDを,HTTP Cookieによってクライアントに返すとき,そのHTTP CookieにはSecure属性が付与されます。