- PR -

セッションタイムアウト画面を表示させたい

1
投稿者投稿内容
田子庄左衛門
会議室デビュー日: 2003/06/10
投稿数: 5
投稿日時: 2007-04-30 15:22
現在 JSF を使った Web アプリケーションの開発をやっているのですが、
技術的にどう解決すべきなのか分からないことがあり、困っております。

web.xml の設定で、認証、及びセッションタイムアウトの設定を下記の
ように記述しております。

<login-config>
 <auth-method>FORM</auth-method>
  <form-login-config>
   <form-login-page>/faces/jsp/Login.jsp</form-login-page>
   <form-error-page>/faces/jsp/LoginError.jsp</form-error-page>
  </form-login-config>
</login-config>

 〜

<session-config>
 <session-timeout>30</session-timeout>
</session-config>

やりたいことは、セッションがタイムアウトした際に、タイムアウト画面を
表示するということなのですが、上記の設定のおかげで次のような動作になって
しまいます。

 1. セッションがタイムアウトする(認証情報もなくなる)
 2. ブラウザから HTTP リクエストを送信する
 3. 認証情報がないため、Login.jsp にリダイレクトされる

上記 3. の処理が動く前に、何らかの手段によってタイムアウト画面に遷移
させたいのですが、実現方法が見つけられずにいます。Filter を使って先に
処理を入れられないか試してみましたが、リダイレクトの方が先に動いて
しまうようで、うまくいきませんでした。

セッションがタイムアウトした場合、いきなりログインページに飛ばすのでは
なく、一旦タイムアウト画面を表示させるにはどのような方法が考えられる
のでしょうか。

【環境】
OS:Windows XP Pro
APサーバ:JBoss 4.0.5 GA
JDK:1.5.0_11
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-04-30 15:43
セッションIDで認証が済んでいるかどうかはセッションに記録されているはずです。
セッションがタイムアウトしていたらその情報が失われてしまうのでちょっと難しいのではないでしょうか。

認証したらセッションにフラグを積んで、HttpSessionBindingListener.valueUnbound() で"このセッションでは認証済みだけどタイムアウトしました"情報をどこかに書き出しておく必要があります。
# HttpSessionListener.sessionDestroyed() だとセッションが破棄されてから呼ばれるのでそのセッションが認証されていたかどうかを取得できません。

さらにサーブレットフィルタで (HttpSession.isNew() = true && "そのセッションIDで認証されていたかどうか") を判定してリダイレクトする、またはなにかメッセージを HttpRequest に積んでおいて Login.jsp で表示するといった工夫が必要になります。

クライアントサイドでよければ、認証したらクッキーを発行して、ログイン画面でクッキーが存在すればメッセージを表示、という手もありますね。


「ユーザID、パスワードを入力してログインしてください。一定時間操作がない場合も自動的にログアウトされるためこの画面が表示されることがあります」
といったメッセージを表示するのが楽でしょう。

[ メッセージ編集済み 編集者: インギ 編集日時 2007-04-30 15:46 ]
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-04-30 16:03
前に解決した時はPhaseListenerで対処しました。
仕掛けるフェーズはRESTORE_VIEWの前でしょうか。

タイムアウトした場合は、クライアントからセッションIDが
送られているにもかかわらずセッションが無効状態になります。

具体的にどう判定したかは覚えてないのですが、
HttpServletRequest#getRequestedSessionId()
HttpServletRequest#isRequestedSessionIdValid()
HttpServletRequest#getSession(false)
HttpSession#isNew()
辺りを使って判定できると思います。
田子庄左衛門
会議室デビュー日: 2003/06/10
投稿数: 5
投稿日時: 2007-05-01 16:58
インギさん、あしゅさん、ご返答くださいましてありがとうございます。

あしゅさんに教えていただきました、PhaseListener を使った対応方式を
試してみましたところ、期待通りタイムアウト画面を表示することができる
ようになりました。

システム特有のロジックが入り込んでしまっていますので、実装したコード
そのものは掲載できないのですが、afterPhase メソッドでタイムアウトか
どうかを判定して、タイムアウトであれば専用のタイムアウト画面に遷移
させるという方式で対応しました。

しかしこれ、認証もセッションタイムアウトも、標準技術を採用しただけで、
特殊な要件とは思えないのですが、一般的な解決策が用意されていないのが
とても不思議です。
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-05-04 18:04
セッションが必ず存在する画面に遷移する サーブレットにて
セッションの情報を確認しチェックする方法ぐらいかな
1

スキルアップ/キャリアアップ(JOB@IT)