【问题标题】:Problem using HttpServletRequest authenticate() within JSF 2.0 preRenderView listener在 JSF 2.0 preRenderView 监听器中使用 HttpServletRequest authenticate() 的问题
【发布时间】:2011-08-10 17:58:10
【问题描述】:

我正在尝试在 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(),它按预期工作。

谢谢, 艾伦

【问题讨论】:

    标签: jsf-2 java-ee-6 servlet-3.0


    【解决方案1】:

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

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

    【讨论】:

    • 我很尴尬地说我没有正确测试这个 - 我刚刚意识到我忘记删除我创建的 ServletFilter,所以是 ServletFilter 进行身份验证,而不是我的侦听器方法.当我删除 ServletFilter 时,对 responseComplete() 的调用失败,因为在调用身份验证之后,当前 FacesContext 为空。我不确定这个协议 - 我应该打开一个新问题吗?
    猜你喜欢
    • 2011-11-07
    • 2012-06-19
    • 1970-01-01
    • 2011-06-29
    • 2013-05-05
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多