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として動作します。
おかげで、 エレン
本当にありがとうございました! – Ellen
ようこそ。 – BalusC
私はこれを正しくテストしなかったと言うのは恥ずかしいです。私が作成したServletFilterを削除するのを忘れてしまったので、リスナーメソッドではなく認証していたServletFilterでした。 ServletFilterを削除すると、認証の呼び出し後に現在のFacesContextがnullであるため、responseComplete()の呼び出しが失敗します。 私はこのためのプロトコルがわかりません - 私は新しい質問を開くべきですか? – Ellen