- - PR -
セッションタイムアウト画面を表示させたい
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 |
|
投稿日時: 2007-04-30 15:43
セッションIDで認証が済んでいるかどうかはセッションに記録されているはずです。
セッションがタイムアウトしていたらその情報が失われてしまうのでちょっと難しいのではないでしょうか。 認証したらセッションにフラグを積んで、HttpSessionBindingListener.valueUnbound() で"このセッションでは認証済みだけどタイムアウトしました"情報をどこかに書き出しておく必要があります。 # HttpSessionListener.sessionDestroyed() だとセッションが破棄されてから呼ばれるのでそのセッションが認証されていたかどうかを取得できません。 さらにサーブレットフィルタで (HttpSession.isNew() = true && "そのセッションIDで認証されていたかどうか") を判定してリダイレクトする、またはなにかメッセージを HttpRequest に積んでおいて Login.jsp で表示するといった工夫が必要になります。 クライアントサイドでよければ、認証したらクッキーを発行して、ログイン画面でクッキーが存在すればメッセージを表示、という手もありますね。 「ユーザID、パスワードを入力してログインしてください。一定時間操作がない場合も自動的にログアウトされるためこの画面が表示されることがあります」 といったメッセージを表示するのが楽でしょう。 [ メッセージ編集済み 編集者: インギ 編集日時 2007-04-30 15:46 ] |
|
投稿日時: 2007-04-30 16:03
前に解決した時はPhaseListenerで対処しました。
仕掛けるフェーズはRESTORE_VIEWの前でしょうか。 タイムアウトした場合は、クライアントからセッションIDが 送られているにもかかわらずセッションが無効状態になります。 具体的にどう判定したかは覚えてないのですが、 HttpServletRequest#getRequestedSessionId() HttpServletRequest#isRequestedSessionIdValid() HttpServletRequest#getSession(false) HttpSession#isNew() 辺りを使って判定できると思います。 |
|
投稿日時: 2007-05-01 16:58
インギさん、あしゅさん、ご返答くださいましてありがとうございます。
あしゅさんに教えていただきました、PhaseListener を使った対応方式を 試してみましたところ、期待通りタイムアウト画面を表示することができる ようになりました。 システム特有のロジックが入り込んでしまっていますので、実装したコード そのものは掲載できないのですが、afterPhase メソッドでタイムアウトか どうかを判定して、タイムアウトであれば専用のタイムアウト画面に遷移 させるという方式で対応しました。 しかしこれ、認証もセッションタイムアウトも、標準技術を採用しただけで、 特殊な要件とは思えないのですが、一般的な解決策が用意されていないのが とても不思議です。 |
|
投稿日時: 2007-05-04 18:04
セッションが必ず存在する画面に遷移する サーブレットにて
セッションの情報を確認しチェックする方法ぐらいかな |
1