我使用了JSF 2.2 Mojarra和会话范围。
一段时间后,会话范围被删除或其他内容。如果我回到登录页面并再次登录,我会有一个新的会话范围,一切都有效。
如果我在Web应用程序上工作,会话范围不会丢失,我没有问题。因此,如果我不使用网络应用程序,我认为必须在一段时间后丢失。
如果我丢失了会话范围,我怎么能自动返回登录页面?
答案 0 :(得分:1)
首先,您应该将状态保存方法设置为服务器,如下所示
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
在此之后,您的web.xml中的会话时间应如下所示
<session-config>
<session-timeout>20</session-timeout>
</session-config>
如果您空闲超过20分钟并且如果尝试从页面发出任何请求,那么您将看到ViewExpiredException的异常堆栈跟踪。现在要重定向到此页面上的登录页面,您在web.xml中有以下配置
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>your login page path</location>
<error-page>
如果您在会话超时后从页面发出非Ajax请求,这将有效。现在要使它在单击ajax按钮时工作,它需要特殊的异常处理程序来处理ajax请求的异常。您可以使用primefaces扩展库中的<pe:ajaxErrorHandler>
。
要使用此功能,您需要在faces-config.xml
中使用以下内容 <application>
<el-resolver> org.primefaces.application.exceptionhandler.PrimeExceptionHandlerELResolver</el-resolver>
</application>
<factory>
<exception-handler-factory>org.primefaces.application.exceptionhandler.PrimeExceptionHandlerFactory</exception-handler-factory>
</factory>
并且使用primefaces扩展名称空间xmlns:pe="http://primefaces.org/ui/extensions"
。
现在,您的页面中只有<pe:ajaxErrorHandler />
。在会话超时后,这将导航到ajax按钮上的登录页面。
要自动导航到登录页面,您可以使用<p:idleMonitor>
类似
<p:idleMonitor timeout="6000" onidle="idleDialog.show()" />
请查看此问题以正确实施空闲监视器
Timeout via idlemonitor (primefaces)
如果您使用的是冰面,请访问以下链接
JSF Session timeout and auto redirect to login page without user intraction eventhough Ajax push is active
你也可以使用omnifaces FullAjaxExceptionHandler,请谷歌这个。
希望这有帮助!!!