Cosminexus 機能解説

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

4.4.3 セッションの管理方法

ここでは,セッションの管理方法について説明します。

Webコンテナでのセッションの管理方法には,HTTP Cookieを使用する方法と,URL書き換えを使用する方法の2種類があります。

Webコンテナは,セッションがどの方法で管理されているかを,セッションIDが何から取得できたかによって判別します。HTTP CookieからセッションIDを取得した場合は,HTTP Cookieによってセッションを管理していると判別します。URLのパスパラメタから取得できた場合は,URL書き換えによってセッションを管理していると判別します。これらの判別は,リクエストごとに実行されます。

次に,セッションの管理方法ごとのセッションIDの管理のされ方について説明します。

<この項の構成>
(1) セッションの管理にHTTP Cookieを使用する場合
(2) セッションの管理にURL書き換えを使用する場合
(3) URL書き換えをする場合に使用するAPIと注意事項
(4) URL書き換えを使用する場合の注意事項

(1) セッションの管理にHTTP Cookieを使用する場合

セッションIDは,HTTP Cookieとして管理されます。

セッションIDを示すHTTP Cookieの名称は,「JSESSIONID」です。この名称は,Servlet仕様で決められているため,変更できません。

(2) セッションの管理にURL書き換えを使用する場合

セッションIDは,URLのパスパラメタとして管理されます。

セッションIDを示すURLのパスパラメタの名称は,「jsessionid」です。この名称は,Servlet仕様で決められているため,変更できません。セッションIDは,WebコンテナによってURLが書き換えられるときに,URLのパスの最後に,「;jsessionid=セッションID」の形式で付加されます。

URLのパスは,階層構造を持っている,リソースを識別するための値です。URLのパスには,クエリやフラグメントは含まれません。このため,これらの要素がURLに含まれている場合,セッションIDは,クエリまたはフラグメントの直前に付加されます。また,URLにセッションID以外のパスパラメタが含まれている場合,セッションIDを示すパスパラメタは,URLに含まれるパスパラメタの最後に付加されます。

ポイント
セッションIDをURLのパスパラメタに追加する場合,URLの文字数が増加します。
増加する文字数を次の表に示します。

表4-9 URL書き換えによって増加するURLの文字数

機能の使用状況 増加するURLの文字数(単位:文字数)
リダイレクタによる負荷分散機能またはサーバID付加機能を使用していない場合 44
リダイレクタによる負荷分散機能を使用している場合 44 + 1(ピリオドの文字数)+ワーカ名の文字数
サーバID付加機能を使用している場合(リダイレクタによる負荷分散機能を使用していないとき) 44 + サーバIDの文字数

注※
「;jsessionid=」の12文字とセッションIDの32文字の合計です。

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

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の正規化したパスが,リクエスト処理中の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の引数ごとの戻り値を次の表に示します。

表4-11 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)の対応の例を次の表に示します。

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

(4) 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()メソッド