2

我正在尝试在 preRenderView 侦听器方法中使用 authenticate(),以便有条件地触发身份验证,具体取决于页面中的视图参数。我尝试添加一个简单的方法:

@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();
}

}

authenticate 方法本身不会抛出异常,它会按预期触发到 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(),它按预期工作。

谢谢,艾伦

4

1 回答 1

0

每当请求被重定向时,您需要告诉 JSF 不要呈现最初要求执行的响应。您可以通过检查是否HttpServletRequest#authenticate()返回false然后相应地调用来做到这一点FacesContext#responseComplete()

if (!request.authenticate(response)) {
    FacesContext.getCurrentInstance().responseComplete();
}
于 2011-08-10T18:09:26.527 回答