WebOTXのセッション管理機能について、教えてください。
・セッションタイムアウト値の設定方法
・セッションタイムアウトとなったリクエストを受信した際の動作についてリクエスト受信時にWebOTXによってセッションタイムアウトを検出することはできますか。
・タイムアウトとなったリクエストに対して、あらかじめ指定したエラー画面を表示するなどの機能がありますか。
・タイムアウトのチェックは指定した時間通りにチェックされますか。
・タイムアウトになったWebコンテナ・メモリ上のセッション情報は、 自動的に破棄されますか。
破棄されるのであれば、そのタイミングはいつでしょうか。
・セッションレプリケーションを利用している場合のデータの保存先と破棄のタイミングについて教えてください。
■セッションタイムアウト値の設定方法
次の箇所で、ドメイン全体、コンテキスト(Webアプリケーション)ごとに設定できます。
両方設定している場合、ドメイン全体よりもコンテキストごとの設定が優先されます。
1) コンテキスト(Webアプリケーション)内のコード
javax.servlet.http.HttpSession#setMaxInactiveInterval()
コンテキストごとの設定
デフォルト 30分
2) <Context Root>/WEB-INF/web.xml
コンテキストごとの設定
デフォルト 30分
3) {WebOTXインストールディレクトリ}/domains/{ドメイン名}/config/default-web.xml
Webコンテナ全体での設定
デフォルト 30分
■Webアプリケーションでセッションタイムアウトを検出する方法
セッションにgetSession(false)でhttpsessionをチェックすることで、確認できます。セッションタイムアウトしていれば戻り値はnullになります。
http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/HttpServletRequest.html#getSession(boolean)
参考:
http://docs.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServletRequest.html#getSession(boolean)
■タイムアウト時のエラー画面をカスタマイズする事はできますか。
特別に用意している画面はありません。 Webアプリケーション内でセッションタイムアウトを検出し、エラー画面を表示させる実装が可能です。
■タイムアウトのチェックは指定した時間通りにチェックされますか。
Webコンテナは、「セッションタイムアウト値の設定方法」で指定した時間間隔でHTTPセッションを破棄するかどうかをチェックしますが、正確に指定した時間間隔にはなりません。これは、1度に全てのHTTPセッションをチェックしているためです。全てのHTTPセッションをチェックするにはある程度の時間を要します。このため、次のチェック時間は「全HTTPセッションのチェックに要した時間+「セッションタイムアウト値の設定方法」で指定した時間」後、という事になります。
■タイムアウトになるとセッション情報は、自動的に破棄されますか。また、破棄されるタイミングはいつですか。
Webコンテナ・メモリ上から解放されるのは、タイムアウトになったことを監視スレッドが検出し削除したあとに、JVMでGCが実行されたタイミングです。
■セッションタイムアウトの挙動について
1) セッション情報登録
リクエストを受信時にWebコンテナがメモリ上にセッション情報を登録
1.2)セッション情報更新
2回目以降のリクエストがあれば、受信時にメモリのセッション情報の時間を更新します。
2) セッションタイムアウトのチェック
Webコンテナはメモリ上のセッション情報をスキャンしてタイムアウトしているものをチェックし、削除します。
3)監視間隔
すべてのセッション情報のチェックが完了すると1分間スリープし、その後次のチェックを開始します。
(つまり監視間隔は約1分)
#セッション情報がメモリから消えるのは、タイムアウト時間+監視間隔+GCまでの時間ということになります。
■セッションレプリケーションを利用している場合のデータの保存先と破棄のタイミングについて
セッションレプリケーションしている場合、HTTPセッションのオブジェクトはレプリケーションを構成しているドメイン間で同期をとる目的でJNDIサーバに保存されます。このため、セッションがタイムアウトしたり invalidate() が呼ばれた場合、HTTPセッションは無効となりますが、JNDIサーバに格納されたHTTPセッションオブジェクトはデフォルトで8分間、破棄(解放)されません。これは、JNDIサーバに保存されたHTTPセッションの情報がレプリケーションを構成する全てのプロセスで共有されているためです。。セッションが破棄されたという情報を各プロセスが検出する必要があるため、invalidate() が呼び出されてから、または、タイムアウトしてから、セッションが無効になった後、さらに8分の待ち時間が経過したあとです。
【対象製品】Application Server
【確認済みのバージョン】 V6.1 V6.2 V6.3 V6.4 V6.5 V7.1 V8.1 V8.2 V8.3 V8.4
【確認済みのエディション】 すべて
【確認済みの対象OS】すべて
【確認済みのJavaバージョン】すべて
【コンポーネント】Webコンテナ
【カテゴリー】開発/設計(性能チューニング)