Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 在JSF 2.0 preRenderView侦听器中使用HttpServletRequest authenticate()时出现问题_Jsf 2_Java Ee 6_Servlet 3.0 - Fatal编程技术网

Jsf 2 在JSF 2.0 preRenderView侦听器中使用HttpServletRequest authenticate()时出现问题

Jsf 2 在JSF 2.0 preRenderView侦听器中使用HttpServletRequest authenticate()时出现问题,jsf-2,java-ee-6,servlet-3.0,Jsf 2,Java Ee 6,Servlet 3.0,我试图在preRenderView侦听器方法中使用authenticate(),以便根据页面中的视图参数有条件地触发身份验证。我尝试添加一个简单的方法: @Named @RequestScoped public class PermissionBean implements java.io.Serializable { public void preRender() { System.out.println("IN PRERENDER"); HttpServletRequest request

我试图在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(),它的工作方式是exptected

谢谢,
Ellen

无论何时请求被重定向,您都需要告诉JSF不要呈现最初要求它做的响应。您可以通过检查是否返回
false
,然后相应地调用

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

当请求被重定向时,您需要告诉JSF不要呈现最初要求它做的响应。您可以通过检查是否返回
false
,然后相应地调用

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

我很难为情地说,我没有正确地测试它——我只是意识到我忘记删除我创建的ServletFilter,所以验证的是ServletFilter,而不是我的侦听器方法。当我删除ServletFilter时,对responseComplete()的调用失败,因为在调用authenticate之后,当前FacesContext为null。我不确定这方面的协议-我应该提出一个新问题吗?我很不好意思说我没有正确地测试它-我只是意识到我忘记删除我创建的ServletFilter,所以是ServletFilter在进行身份验证,而不是我的侦听器方法。当我删除ServletFilter时,对responseComplete()的调用失败,因为在调用authenticate之后,当前FacesContext为null。我不确定这方面的协议-我应该提出一个新问题吗?