Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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
JSF2.0会话超时引发IllegalStateException_Jsf - Fatal编程技术网

JSF2.0会话超时引发IllegalStateException

JSF2.0会话超时引发IllegalStateException,jsf,Jsf,我必须在会话超时后注销用户。我使用EventListener清除会话,还使用PhaseListener在执行任何处理之前验证用户 会话结束后,我尝试单击任何按钮时出现以下异常: java.lang.IllegalStateException org.apache.catalina.connector.ResponseFacade.reset(ResponseFacade.java:310) com.sun.faces.context.ExternalContextImpl.responseRes

我必须在会话超时后注销用户。我使用EventListener清除会话,还使用PhaseListener在执行任何处理之前验证用户

会话结束后,我尝试单击任何按钮时出现以下异常:

java.lang.IllegalStateException
org.apache.catalina.connector.ResponseFacade.reset(ResponseFacade.java:310)
com.sun.faces.context.ExternalContextImpl.responseReset(ExternalContextImpl.java:821)
com.sun.faces.context.ExceptionHandlerImpl.throwIt(ExceptionHandlerImpl.java:251)
com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:141)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:113)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:395)
My web.xml包含以下条目:

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/content/country/default/jsp/login.faces</location>
</error-page>
<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/content/country/default/jsp/error.faces</location>
</error-page>
您收到此异常,响应已提交

com.sun.faces.context.ExternalContextImpl.responseReset(ExternalContextImpl.java:821)
com.sun.faces.context.ExceptionHandlerImpl.throwIt(ExceptionHandlerImpl.java:251)
com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:141)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:113)
因此,JSF在恢复视图阶段遇到异常,需要抛出异常,以使其最终进入错误页面,但是它无法这样做,因为此时响应已经提交,而JSF没有被告知它应该立即继续呈现响应

现在还不清楚这个阶段监听器到底什么时候完成它的工作,但是您的主要兴趣是弄清楚在恢复视图阶段到底抛出了哪个异常,以及为什么此时已经提交了响应。根据目前公布的代码和信息,无法回答此问题。运行调试器应该告诉您有关异常的更多信息,跟踪提交响应的代码流应该告诉您有关意外提交的更多信息

无论如何,我对您的以下功能要求很感兴趣:

我必须在会话超时后注销用户。我正在使用EventListener清除会话


我不明白为什么那是必要的。登录用户通常表示为会话属性。如果会话超时,那么登录的用户应该已经自动消失。你不需要自己采取任何清理行动。只要在需要执行任何基于会话的操作时检查登录用户是否在会话中。

基本上,应用程序会创建一个身份验证令牌并将其记录在数据库中。要求是在会话到期或用户注销后,它应该失效。因此,我试图在sessionDestroy方法中使auth令牌无效。让我运行调试器,如果我弄清楚了,我会给你回复的。感谢HttpSessionListener实现的sessionDestroyed方法,你是说?我仍然想知道事件侦听器和阶段侦听器与它有什么关系。该阶段侦听器何时运行?是的,phaseListener在AfterPhasePaseEvent方法中,我们在其中检查用户身份验证。我不确定这段代码是否引发异常。同样的代码也适用于一些我们正在进行直接调用的页面,比如/abc.faces,但它基本上不适用于一些调用bean特定方法的单击。是的,但是在哪个阶段?至于回发期间的异常,这只能意味着它是ViewExpiredException,这在会话中非常正常,因此视图状态也已过期。但你真正的问题是,在这一点上,回应已经做出了承诺。此时不应该提交它,或者至少应该告诉JSF不要执行生命周期。您在浏览器中看到的是哪种页面?您是否在某处调用response.sendRedirect而不阻塞其余的请求/响应?可能在某个过滤器中?我想我没有做响应。sendRedirect,我在会话中只在一页上。然后会话到期,我单击一个按钮,进入特定bean的操作。此时它进入phaseListener并抛出异常。
java.lang.IllegalStateException
org.apache.catalina.connector.ResponseFacade.reset(ResponseFacade.java:310)
com.sun.faces.context.ExternalContextImpl.responseReset(ExternalContextImpl.java:821)
com.sun.faces.context.ExceptionHandlerImpl.throwIt(ExceptionHandlerImpl.java:251)
com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:141)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:113)