2009-08-04 7 views
6

私はお互いの上に構築された一連のサインアップページを持っています。ユーザーセッションが終了すると、サーバー上のすべてをクリーンアップするリスナーがあり、うまく動作します。しかし、ユーザーが何か他のことをやろうとすると、それらをシリーズの最初のページにリダイレクトしたいだけです。しかし、私のフィルタは正しく動作していないようです。私はjavax.faces.application.ViewExpiredExceptionを取得し続けていますJSFとRichfacesで期限切れのViewStateを処理する

このエクスカーションを処理するベストプラクティスは何ですか? web.xmlで処理できないのは、それがグローバルすぎるためです。さらに、エラーページがいくつかのJSFコードからレンダリングされています - これはPhaseListenerを使用して起こっていることを把握する必要があるようですが、例外は最初に発生しませんが、良いモデルを見つけることができませんでしたこれを行う方法については、何か案は?

答えて

1

あなたは位相リスナーで正しいトラックだと思います。基本的には、最初のページでセッションで何かを設定してください。その後、フェーズリスナーでセッションの値を探します。終了しない場合は、リダイレクトを行います。このトリックは、フェーズリスナープロセスの早い段階で行うことです。 フェーズリスナーが例外をスローしているプロセスの正確な場所が不明です。

0

あなたは、セッションが無効であるかどうかを確認することができ

ブールsessionInValid = httpServletRequest.getRequestedSessionId() = nullを& & httpServletRequest.isRequestedSessionIdValid()!!;

ここで、ブール変数sessionInValidは、セッションが何らかの方法で無効になっている場合にtrueを返します。

これをフィルタまたはリスナーに追加し、web.xmlファイルでこれを設定できます。

1

私がこれを処理する方法は、追跡するURLにのみマップされたweb.xmlにフィルタを追加することです。このフィルタは、セッションが期限切れになっているかどうかをチェックし、セッションがあればログインページに転送します。 JSFコードが実行される前にフィルタが実行されていれば動作するはずです。

2

Richfacesには、ViewExpiredExceptionを処理するための独自のメカニズムがあります(Richfaces docsを参照)。

+0

しかし、それはajaxリクエストのためだけに機能します。 – Inv3r53

+0

これは、セッションの有効期限を表示するのではなく、* session * expiryを参照します。 – EJP

1

私が過去にこれを処理したのは、マネージセッションBeanのフィールドをチェックするリスナーを使用することです。ユーザーセッションがタイムアウトすると、リスナーがmbeanをクリーンアップし、ユーザーがログインしていないとマークします。すべての要求はリスナーを介して送信され、要件が満たされない場合、ユーザーはサイトから強制的に抜け出します。私は決して私のログにViewExpiredExceptionを取得しません。この例外が発生した唯一の時間は、サーバーが再起動され、以前のアクティブなセッションがあるときにユーザーがページを要求した場合です。

関連する問題