Cosminexus 機能解説

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

12.6.4 リクエスト実行時の処理

ここでは,リクエスト実行時のグローバルセッションフェイルオーバ用フィルタの処理と,グローバルセッション情報の格納,更新,削除処理について説明します。

<この項の構成>
(1) リクエスト実行時のセッションフェイルオーバ用フィルタの処理
(2) グローバルセッション情報の格納処理
(3) グローバルセッション情報の更新処理
(4) グローバルセッション情報の削除処理

(1) リクエスト実行時のセッションフェイルオーバ用フィルタの処理

セッションフェイルオーバ用フィルタでは,リクエスト実行前には,グローバルセッション情報をロックし,必要に応じて引き継ぎ処理をします。また,リクエスト処理後には,グローバルセッション情報を格納または更新して,ロックを解除します。

(a) グローバルセッション情報のロックについて

異なるJ2EEサーバから同じグローバルセッション情報を同時に更新されることを抑止するため,セッションフェイルオーバ用フィルタでは,SFOサーバ上のグローバルセッション情報のロックをします。

  1. J2EEアプリケーションでのリクエスト処理で,SFOサーバのグローバルセッション情報を使用すると,SFOサーバ上のグローバルセッション情報はロックされます。
    このとき,別のJ2EEサーバがグローバルセッション情報を使用しようとすると,ロックの解除待ちとなります。
  2. グローバルセッション情報を使用しているJ2EEアプリケーションでリクエスト処理が完了すると,SFOサーバでのロックが解除されます。
    ロック解除時に,ロックの解除待ちとなっているJ2EEアプリケーションがある場合は,ロックが解除されたグローバルセッション情報を使用してリクエスト処理をします。

グローバルセッション情報にロックを設定することによって,J2EEアプリケーションでのダブルクリックなどによって二重送信されたリクエストが別のJ2EEサーバに送信された場合の誤動作も防止できます。

なお,ロックの解除待ちには,タイムアウトを設定できます。解除待ちでタイムアウトした場合,該当するグローバルセッション情報は使用できなくなります。このとき,セッションは破棄され,新規リクエストとしてJ2EEアプリケーションを呼び出します。

(b) セッション情報の引き継ぎ処理について

セッション情報の引き継ぎ処理では,新規にHttpSessionオブジェクトを生成し,セッション情報を登録します。Servlet仕様で提供されているセッションに関する次の三つのリスナをJ2EEアプリケーションで定義している場合,リスナへの通知が実施されます。

呼び出されるリスナの種類について,システム内で発生するイベントごとに次の表に示します。

表12-8 呼び出されるリスナの種類

システム内で発生するイベント 呼び出されるリスナ HttpSessionオブジェクト,およびグローバルセッションへの操作
ログイン HttpSessionListener
  • HttpSessionオブジェクトの作成
  • グローバルセッションの作成
J2EEアプリケーション内でのセッションの使用 HttpSessionAttributeListener
HttpSessionBindingListener

  • HttpSessionオブジェクトへのセッション情報の格納
  • HttpSessionオブジェクトからのセッション情報の削除
ログアウト HttpSessionListener
HttpSessionAttributeListener
HttpSessionBindingListener

  • HttpSessionオブジェクトの破棄
  • グローバルセッションの破棄
障害発生によるグローバルセッション情報の引き継ぎ
  • HttpSessionオブジェクトの作成
  • HttpSessionオブジェクトへのグローバルセッション情報の格納
ほかのサーバに引き継がれたHttpSessionオブジェクトの有効期限切れ
  • HttpSessionオブジェクトの削除

(2) グローバルセッション情報の格納処理

グローバルセッションは,HTTPセッションと同時に生成されます。グローバルセッションが生成されると,グローバルセッション情報も生成されます。このとき,HttpSessionオブジェクトに対してセッション情報が未登録である場合も,グローバルセッション情報は生成されます。ただし,セッション情報が未登録であるという情報が生成されます。

J2EEアプリケーションでHttpSessionオブジェクトの作成後,グローバルセッション情報がSFOサーバに格納されるまでの処理について,次の図に示します。

参考
次の図とその説明は,グローバルセッションの制御方法として,HTTP Cookieを使用している場合の例です。URL書き換えを使用している場合の処理の違いについては,「12.6.7 URL書き換えを使用する場合の処理の違い」を参照してください。

 

図12-24 グローバルセッション情報の格納処理

[図データ]

  1. J2EEアプリケーション内の処理で,HttpSessionオブジェクトが作成されます。
    javax.servlet.http.HttpServletRequestインタフェースのgetSessionメソッドが呼び出され,HttpSessionオブジェクトが作成されます。
  2. 作成されたHttpSessionオブジェクトに対応する,グローバルセッションIDが発行されます。
  3. SFOサーバに新しいグローバルセッション情報を追加します。追加されたグローバルセッション情報はロックされます。
  4. HTTPレスポンスのヘッダのSet-Cookieヘッダに,グローバルセッションIDが追加されます。
  5. SFOサーバにグローバルセッション情報を送信し,格納します。

(3) グローバルセッション情報の更新処理

J2EEアプリケーションでセッションを使用し,グローバルセッション情報が更新されると,SFOサーバ内のグローバルセッション情報も更新する必要があります。

なお,グローバルセッション情報の更新中は,グローバルセッション情報にロックが掛かります。ロックが掛かると,ほかのJ2EEサーバからのグローバルセッション情報の操作ができなくなります。

グローバルセッション情報の更新処理について,次の図に示します。

参考
次の図とその説明は,グローバルセッションの制御方法として,HTTP Cookieを使用している場合の例です。URL書き換えを使用している場合の処理の違いについては,「12.6.7 URL書き換えを使用する場合の処理の違い」を参照してください。

 

図12-25 グローバルセッション情報の更新処理

[図データ]

  1. SFOサーバ上のグローバルセッション情報にロックが掛かります。
    J2EEアプリケーションの処理の前に,グローバルセッション情報にロックが掛かります。
  2. J2EEアプリケーション内の処理でHttpSessionオブジェクトを使用すると,HttpSessionオブジェクトに登録されたグローバルセッション情報が更新されます。
  3. J2EEアプリケーション処理の終了後,SFOサーバにセッション情報を送信します。
  4. SFOサーバ上のグローバルセッション情報を最新に更新します。
  5. SFOサーバ上のグローバルセッション情報のロックを解除します。

(4) グローバルセッション情報の削除処理

J2EEアプリケーション内で,javax.servlet.http.HttpSessionインタフェースのinvalidateメソッドが呼び出される場合の,明示的なグローバルセッション情報の削除の処理について,次の図に示します。

参考
次の図とその説明は,グローバルセッションの制御方法として,HTTP Cookieを使用している場合の例です。URL書き換えを使用している場合の処理の違いについては,「12.6.7 URL書き換えを使用する場合の処理の違い」を参照してください。

 

図12-26 グローバルセッション情報の明示的な削除

[図データ]

  1. SFOサーバ上のグローバルセッション情報にロックが掛かります。
    J2EEアプリケーションの処理の前に,グローバルセッション情報にロックが掛かります。
  2. J2EEアプリケーション内の処理で,明示的にHttpSessionオブジェクトを破棄します。
    javax.servlet.http.HttpSessionインタフェースのinvalidateメソッドを呼び出して,オブジェクトを破棄します。
  3. J2EEアプリケーション処理の終了後,SFOサーバにグローバルセッション情報の削除要求を送信します。
  4. SFOサーバ上のグローバルセッション情報が削除されます。
  5. クライアント上にあるグローバルセッションIDのHTTP Cookie情報を削除するように設定されます。
    HTTPレスポンスヘッダに,HTTP Cookieを期限切れでセットします。ただし,J2EEアプリケーションでHTTPレスポンスがすでにコミットされていた場合は,期限切れでのセットは実施されません。

クライアント上のグローバルセッションIDのHTTP Cookie情報が削除されるのは,レスポンスがコミットされていなかった場合だけです。J2EEアプリケーションからセッションフェイルオーバ用フィルタに処理が戻った時点で,すでにレスポンスがコミットしている場合は,クライアント上のグローバルセッションIDのHTTP Cookie情報は削除されません。この場合,次に送信するリクエストにグローバルセッション情報がCookieとして付けられた時点で,HTTP Cookie情報の削除処理が実施されます。