在JSF Web应用程序中处理"会话已过期",在JBoss AS 5中运行

Vee*_*era 18 java session jsf servlet-filters viewexpiredexception

这个问题与我的另一个问题" 如何在Java Web应用程序中过期会话时重定向到登录页面? "有关.以下是我正在尝试做的事情:

  1. 我在JBoss AS 5上运行了一个JSF Web应用程序
  2. 当用户处于非活动状态时,例如15分钟,我需要注销用户并将其重定向到登录页面,如果他在会话过期后尝试使用该应用程序.
  3. 因此,正如' JSF Logout and Redirect '中所建议的那样,我已经实现了一个过滤器,它检查会话过期情况,并在会话过期时将用户重定向到session-timed-out.jsp页面.
  4. 我已经在web.xml中的所有其他过滤器定义之上添加了SessionExpiryCheckFilter,因此我的会话到期检查将始终获得第一次命中.

现在面临着我所面临挑战.由于我正在使用JBoss AS,当会话到期时,JBoss会自动将我重定向到登录页面(请注意,不会调用会话到期检查过滤器).因此,在我登录后,我的SessionExpiryCheckFilter拦截了请求,并且它看到会话可用.但是,它抛出异常javax.faces.application.ViewExpiredException: viewId:/mypage.faces - View /mypage.faces could not be restored.

以前有人遇到过这个问题吗?有什么想法可以解决这个问题?

Chr*_*ale 14

以下方法适用于我.请注意,您必须使用JSTL核心taglib重定向而不是jsp重定向才能使其正常工作(因为jsp也会过期).

FacesConfig.xml中,您输入以下内容:

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/sessionExpired.jsf</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

sessionExpired.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<c:redirect url="/login.jsf" />
Run Code Online (Sandbox Code Playgroud)

您还可以将此方法用于其他错误类型或异常.例如,元素包含错误代码或异常类型与Web应用程序中资源路径之间的映射:

<error-page>
    <error-code>400</error-code>
    <location>/400.html</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

或element包含Java异常类型的完全限定类名.

<error-page>
    <exception-type>javax.servlet.ServletException</exception-type>
    <location>/servlet/ErrorDisplay</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)