2011-08-10 9 views
2

preRenderViewリスナーメソッドでauthenticate()を使用して、ページ内のビューパラメータに応じて条件付きで認証をトリガしようとしています。私は簡単な方法を追加しようとした:JSF 2.0内のHttpServletRequest authenticate()を使用した問題preRenderViewリスナー

@Named 
@RequestScoped 
public class PermissionBean implements java.io.Serializable { 
public void preRender() { 
System.out.println("IN PRERENDER"); 

HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse(); 
try { 
    request.authenticate(response); 
} catch (Exception e) { // may throw ServletException or IOException 
    e.printStackTrace(); 
} 

}

自体が例外をスローしない認証方法は、それが予想通りLogin.xhtmlへのリダイレクトをトリガします。しかし、私は私のサーバーログに取得しています、私はこの例外を取得:

enter code here 

INFO: IN PRERENDER 
FINEST: GET /Login.xhtml previous[3] 
INFO: Exception when handling error trying to reset the response. 
java.lang.NullPointerException 
at  com.sun.faces.facelets.tag.jsf.core.DeclarativeSystemEventListener.processEvent(EventHandler.java:126) 
at javax.faces.component.UIComponent$ComponentSystemEventListenerAdapter.processEvent(UIComponent.java:2508) 
at javax.faces.event.SystemEvent.processListener(SystemEvent.java:106) 
at com.sun.faces.application.ApplicationImpl.processListeners(ApplicationImpl.java:2129) 
at com.sun.faces.application.ApplicationImpl.invokeComponentListenersFor(ApplicationImpl.java:2077) 
at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:286) 
at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:244) 
at javax.faces.application.ApplicationWrapper.publishEvent(ApplicationWrapper.java:670) 
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:108) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) 

だから私の要求はLogin.xhtmlにリダイレクトされていません。

私の質問は、JSFマネージドBean内で動作するはずのもの、またはJSFリクエストライフサイクルの外でのみ有効なものですか?私はWebFilterからauthenticate()を呼び出してみましたが、exptectedとして動作します。

おかげで、 エレン

答えて

0

は、あなたはそれが最初のリクエストがリダイレクトされたときはいつでも、やるように頼まれたレスポンスをレンダリングしないようにJSFを指示する必要があります。 HttpServletRequest#authenticate()falseを返すかどうかを確認し、それに応じてFacesContext#responseComplete()を呼び出すことでそれを行うことができます。

if (!request.authenticate(response)) { 
    FacesContext.getCurrentInstance().responseComplete(); 
} 
+0

本当にありがとうございました! – Ellen

+0

ようこそ。 – BalusC

+0

私はこれを正しくテストしなかったと言うのは恥ずかしいです。私が作成したServletFilterを削除するのを忘れてしまったので、リスナーメソッドではなく認証していたServletFilterでした。 ServletFilterを削除すると、認証の呼び出し後に現在のFacesContextがnullであるため、responseComplete()の呼び出しが失敗します。 私はこのためのプロトコルがわかりません - 私は新しい質問を開くべきですか? – Ellen

関連する問題