2012-12-21 3 views
5

私のJSFアプリケーションでは、authenticati0nプロセスをチェックするために使用されるFilterがあります。認証に失敗すると、フィルタはlogin.xhtmlにリダイレクトされます。FacesMessageをフィルターで設定する

FilterからFacesMessageをログインページに渡すにはどうすればよいですか?

私は以下で使用しましたが、それは問題ありません。

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null)); 

AuthenticationFilter.java

​​

答えて

7

FacesContextFacesServletによって作成されます。フィルターの中にいるとき、まだ呼び出されていません。フィルタはサーブレットの前で実行されます。したがって、フィルタ内でFacesContextに手を差し伸べることはできません。加えて、顔のメッセージは要求スコープであるため、リダイレクトによってそれらは消えてしまいます。

login.xhtmlは、<f:event type="preRenderView">の間にそれ自身で設定します。最も簡単な方法は、フィルタを一時的にセッションスコープに置くことです。私はEJBタイマーでのFacesContextを取得しようとして同様の問題に遭遇した

String message = (String) externalContext.getSessionMap().remove("message"); 

if (message != null) { 
    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null)); 
} 
+0

ご協力いただきありがとうございます。 – CycDemo

+0

ようこそ。 – BalusC

0

:あなたはlogin.xhtmlの事前レンダービューリスナーメソッドでは、セッション・スコープから削除

session.setAttribute("message", message); 
httpResponse.sendRedirect(loginView); 

。 BalusCは、これを行うことが不可能であることを複数のスレッドで指摘しています。代わりに、 'ServletContextListener'を使用することもできますが、ScheduledExecutorServiceはスケジューリングをEJBタイマーとしてうまく定義しません。

どのような場合でも、彼が作成した提案の1つは、マネージドBeanに裏打ちされたJSFページに実際にWebリクエストを作成して、アプリケーションスコープBean上のメソッドを利用してタイマーを設定する方法でした。

これは、あなたが望むメッセージとユーザーのIPアドレスなどを使ってJSFページにparamを渡すようなことができるように思えるからです。そのページは、リクエストスコープのBeanによってサポートされています。リクエストスコープBeanには、アプリケーションスコープのBeanが注入されており、IPをキーとしてマップに格納します。その後、ユーザーがログインページにリダイレクトされると、そのページは、そのアプリケーションスコープ付きBeanが挿入された要求スコープBeanでgetエラーメッセージメソッドを呼び出し、そのIPまたはその行に沿ったエラーメッセージを取得できます。

いずれにしても、BalusCの答えは十分で、これよりも適切だと確信していますが、彼の「ちょうどejbタイマーからのリクエストを作成する」という提案は、アプリケーションスコープのBeanのメソッド呼び出しをスケジューリングするのにうまくいきました。私はここでその可能な使い方を思い起こさせるかもしれないと思った。

@BalusCあなたが私が参照している投稿についてのご意見はありますか?私はそれを見つけることができません。