Hitachi

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


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

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

〈この項の構成〉

(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がホスト名の指定で,リクエストのURLがIPアドレスの場合

  • 引数のURLがIPアドレスの指定で,リクエストのURLがホスト名の場合

また,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書き換えを使用する場合の注意事項について説明します。

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

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

(5) HTTPセッションの属性名に関する注意事項

HTTPセッションでは,次に示す属性名の属性をアプリケーションで使用することや削除することはできません。

(6) CDI使用時のセッション情報引き継ぎ機能に関する注意事項

CDIが有効なアプリケーションに対して,各種セッションフェイルオーバ機能は使用できません。

セッションフェイルオーバ機能を使用するJ2EEサーバでは,プロパティ「ejbserver.javaee.cdi.beansXmlRequired」にtrueを指定してください。また,「beans.xml」ファイルを含んだアプリケーションをセッションフェイルオーバの対象にしないでください。セッションフェイルオーバ機能については,マニュアル「アプリケーションサーバ 機能解説 拡張編」を参照してください。