Cosminexus 機能解説

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

12.7.1 実装時の留意事項

セッションフェイルオーバ機能を使用するアプリケーションを開発する場合に,留意する点について説明します。

<この項の構成>
(1) セッションフェイルオーバ用フィルタの呼び出し順序
(2) JSPで暗黙的に作成されるHTTPセッションの扱い
(3) セッション管理に使用する情報の選択
(4) 障害発生時の動作を考慮した処理の実装
(5) HTTPセッションの破棄に伴う動作
(6) セッション情報の引き継ぎが発生した場合の認証情報の扱い
(7) セッションフェイルオーバ機能使用によるサーブレットAPIの動作
(8) JSPでの<jsp:useBean>タグの使用

(1) セッションフェイルオーバ用フィルタの呼び出し順序

セッションフェイルオーバ用フィルタは,サーブレットフィルタとして提供されます。セッションフェイルオーバ用フィルタは,ほかのサーブレットフィルタよりも前に呼び出される必要があります。HTTPレスポンス圧縮フィルタ,およびユーザ作成のフィルタよりも前に配置してください。

(2) JSPで暗黙的に作成されるHTTPセッションの扱い

セッションフェイルオーバ機能を有効にしたアプリケーションでは,セッションを作成すると必ずグローバルセッションIDが発行され,グローバルセッション情報を使用しないサーブレットまたはJSPであっても,「グローバルセッション情報が存在しない」という情報がSFOサーバに冗長化されます。

JSPでは,デフォルトでHttpSessionオブジェクトが作成されます。メモリの使用量や,SFOサーバとの通信による負荷を考慮し,セッションを必要としないJSPでは明示的にHttpSessionオブジェクトを作成しない設定にしてください。HttpSessionオブジェクトを作成しない設定には,pageディレクティブのsession属性を使用してください。

(3) セッション管理に使用する情報の選択

HTTPセッションのセッション管理には,グローバルセッション情報を使用するようにしてください。

セッションフェイルオーバ機能では,障害発生時にグローバルセッション情報は引き継げますが,HTTPセッションは新しく作成されます。このため,HTTPセッションのセッションIDはグローバルセッション情報の引き継ぎの前後で異なります。したがって,HTTPセッションのセッションIDを基に制御を実行するアプリケーションは,グローバルセッション情報を基に制御を実行するように変更する必要があります。

(4) 障害発生時の動作を考慮した処理の実装

セッションフェイルオーバ機能を使用するアプリケーションでは,障害発生時にグローバルセッション情報の引き継ぎ処理や,書き換え可能グローバルセッション情報の削除処理が発生します。

アプリケーションでは,これらを想定した処理を実装する必要があります。

(a) セッション情報の引き継ぎを考慮した処理

J2EEサーバやWebサーバに障害が発生すると,リクエストが別のJ2EEサーバに転送されて,セッション情報が引き継がれます。アプリケーションが引き継ぎ先のJ2EEサーバで問題なく業務を続けるためには,必要な情報をすべてグローバルセッション情報として設定しておく必要があります。

グローバルセッション情報として設定できる情報については,「12.2.3 グローバルセッション情報」を参照してください。また,グローバルセッション情報の引き継ぎについては,「12.2.6 サーバの状態とグローバルセッション情報の引き継ぎ」を参照してください。

(b) HTTPセッションに同一のオブジェクトが複数回登録されている場合を考慮した処理

HttpSessionオブジェクトに同じオブジェクトが複数登録されていた場合に,引き継ぎ後のHttpSessionオブジェクトに登録されるオブジェクトが異なるので,注意が必要です。

(c) 書き換え可能グローバルセッション情報の削除を考慮した処理

SFOサーバに障害が発生した場合など,書き換え可能グローバルセッション情報の削除が発生したとき,HttpSessionオブジェクトには読み込み専用グローバルセッション情報とグローバルセッション情報でないセッション情報が残ります。

リクエスト処理を実行する前に,書き換えグローバルセッション情報が削除されていないかどうかを確認する処理を実行して,削除されている場合には適切な処理を実行してください。

例えば,グローバルセッション情報が次のように設定されている場合があります。

この場合,書き換え可能グローバルセッション情報が削除されると,HttpSessionオブジェクトに登録されたセッション情報の内容はログイン直後の状態に戻ります。この状態から業務をやり直すためには,オブジェクトを再作成する処理や,javax.servlet.http.HttpServletResponseインタフェースのsendRedirectメソッドを使用してログイン直後のページに戻す処理などが必要になります。

J2EEアプリケーション内での書き換え可能グローバルセッション情報が削除されているかどうかは,HttpSessionオブジェクトに登録した書き換え可能グローバルセッション情報があるかどうかで確認できます。確認した結果,あるはずの書き換え可能グローバルセッション情報がなくなっていた場合,書き換え可能グローバルセッション情報が削除されたと判断できます。

(5) HTTPセッションの破棄に伴う動作

HTTPセッションを破棄するアプリケーション内でレスポンスのコミットを実行しても,クライアント上のグローバルセッションIDのHTTP Cookie情報は削除されません。この場合,コミット後にリクエストを送信するとき,グローバルセッションIDがリクエストヘッダのCookieとして付加されて,J2EEサーバ,SFOサーバのメッセージログに次のログメッセージが出力されます。

ただし,これらのメッセージが出力された場合も,J2EEサーバ,SFOサーバでの実際のリクエスト処理,およびセッションフェイルオーバ機能への影響はありません。なお,クライアント上のグローバルセッションIDのHTTP Cookie情報を削除する処理は,この時点で実行されます。以降のリクエスト処理ではこのHTTP Cookieは付加されません。

また,javax.servlet.http.HttpServletResponseインタフェースのsendRedirectメソッドを使用した場合も,レスポンスがコミットされて,リダイレクト先アドレスへのアクセス時にKDJE34234-Wのメッセージが出力されます。このとき,リダイレクト先アドレスがFORM認証を使用しているページへのアドレスであった場合,J2EEサーバのメッセージログにはKDJE34234-Wのメッセージではなく,KDJE34229-Wのメッセージ(出力レベル:Warning)が出力されます。ただし,この場合も,認証機能およびセッションフェイルオーバ機能への影響はありません。

(6) セッション情報の引き継ぎが発生した場合の認証情報の扱い

Webコンテナで使用できるログイン認証には,サーブレットAPIで定義されているフォーム認証による認証と,HTTPが定義しているBasic認証による認証があります。

セッションフェイルオーバ機能を使用するシステムで認証機能を使用している場合,J2EEサーバまたはWebサーバの障害発生時には次のように動作します。

(7) セッションフェイルオーバ機能使用によるサーブレットAPIの動作

セッションフェイルオーバ機能を使用する場合と,使用しない場合とで動作が変わるサーブレットAPIがあります。次に,セッションフェイルオーバ機能によって動作に変更があるAPIおよび注意点を示します。

表12-9 セッションフェイルオーバ機能と関係するサーブレットAPI

項番 クラス名またはインタフェース名※1 API名 注意点
1 ServletContext getAttributeNames HTTP Cookieによるグローバルセッション制御が有効な場合に動作が変わります。グローバルセッションIDに使用するHTTP Cookie名称をサーブレットコンテキストに属性として登録します。グローバルセッションIDは,セッションフェイルオーバ用フィルタ開始時に初期化パラメタに設定されたIDです。getAttributeNamesで取得できる属性名にこの属性の名称が含まれます。セッションフェイルオーバ用フィルタが登録する属性については,「12.7.3 アプリケーションを実行するときに追加される属性」を参照してください。
2 ServletContextAttributeListener attributeAdded HTTP Cookieによるグローバルセッション制御が有効な場合に動作が変わります。グローバルセッションIDに使用するHTTP Cookie名称をサーブレットコンテキストに属性として登録するために,javax.servlet.ServletContextAttributeListenerクラスのattributeAddedメソッドが呼び出されます。グローバルセッションIDは,セッションフェイルオーバ用フィルタ開始時に初期化パラメタに設定されたIDです。サーブレットコンテキストに登録する属性については,マニュアル「12.7.3 アプリケーションを実行するときに追加される属性」を参照してください。
3 HttpServletRequest getCookies HTTP Cookieによるグローバルセッション制御が有効な場合に動作が変わります。グローバルセッションが発行されると,グローバルセッションIDがCookieヘッダにセットされます。HTTP Cookieの名称は,GIDCookieNameパラメタに指定した値です。
4 getHeader
5 getHeaderNames
6 getHeaders
7 getSession HTTPセッション作成時に,J2EEサーバのHTTPセッション数に余裕がある場合でも,SFOサーバでグローバルセッション数が上限に達すると,IllegalStateException例外が発生します。
8 HttpServletResponse encodeRedirectURL URL書き換えによるグローバルセッション制御が有効な場合に動作が変わります。グローバルセッションIDをURLに含めてエンコードします。グローバルセッションIDは,HTTPセッションIDとともにエンコードされます。この処理は必要に応じて実行されます。
9 encodeURL
10 encodeRedirectUrl※2
11 encodeUrl※2
12 HttpSession getAttribute 書き換え可能グローバルセッション情報の削除処理が発生すると,Webコンテナによって属性が追加されます。Webコンテナが追加する属性については,「12.7.3 アプリケーションを実行するときに追加される属性」を参照してください。
13 getAttributeNames
14 getCreationTime 引き継ぎが発生すると,引き継ぎ処理によってHttpSessionオブジェクトが作成されるため,引き継ぎ発生前と異なる値が返されます。
15 getId※3
16 getLastAccessedTime 引き継ぎ発生後,初回のリクエスト時には前回アクセスの時刻を返すことができません。
17 isNew※4 引き継ぎによって,HttpSessionオブジェクトが作成されると,戻り値が「true」となります。
18 HttpSessionAttributeListener リスナについては,「12.6.4 リクエスト実行時の処理」を参照してください。
19 HttpSessionBindingListener
20 HttpSessionListener
21 HttpServletRequestWrapper 動作については,javax.servlet.http.HttpServletRequestインタフェースの動作を参考にしてください。

注※1
クラス名およびインタフェース名は,「javax.servlet.http.」を省略しています。

注※2
Servlet 2.1仕様で非推奨とされているAPIです。

注※3
HTTPセッションのセッションIDを基に制御が行われるWebアプリケーションは,グローバルセッション情報を基に制御が行われるように変更する必要があります。

注※4
isNewメソッドの戻り値によって制御が行われるWebアプリケーションでは,HttpSessionオブジェクトを新規に作成した場合,必ず登録するセッション情報を設けてください。そのセッション情報を読み込み専用グローバルセッション情報とし,isNewメソッドを使用する代わりにそのセッションがHttpSessionオブジェクトに登録されているかどうかで新規セッションかどうかを判断するようにしてください。

(8) JSPでの<jsp:useBean>タグの使用

JSPで<jsp:useBean>タグを使用する時,scope属性を"session"とすることで,JavaBeansがHttpSessionオブジェクトの属性として登録されます。

<jsp:useBean>タグのscope属性を"session"とする場合には,次の設定が必要になります。