如果我丢失了JSF会话范围,我想更改为登录页面

时间:2014-04-22 12:55:37

标签: session jsf-2

我使用了JSF 2.2 Mojarra和会话范围。

一段时间后,会话范围被删除或其他内容。如果我回到登录页面并再次登录,我会有一个新的会话范围,一切都有效。

如果我在Web应用程序上工作,会话范围不会丢失,我没有问题。因此,如果我不使用网络应用程序,我认为必须在一段时间后丢失。

如果我丢失了会话范围,我怎么能自动返回登录页面?

1 个答案:

答案 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,请谷歌这个。

希望这有帮助!!!