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

这个问题与我的另一个问题“当Java Web应用程序中的会话过期时如何重定向到登录页面?”有关。以下是我正在尝试执行的操作:

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

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

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


答案 1

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

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

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/sessionExpired.jsf</location>
</error-page>

会话已过期.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" />

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

<error-page>
    <error-code>400</error-code>
    <location>/400.html</location>
</error-page>

或元素包含 Java 异常类型的完全限定类名。

<error-page>
    <exception-type>javax.servlet.ServletException</exception-type>
    <location>/servlet/ErrorDisplay</location>
</error-page>

答案 2

如果您使用的是Mojarra / Sun RI,则可能需要尝试将其添加到您的Web中.xml:

<context-param>
    <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name> 
    <param-value>true</param-value>
</context-param>

但是请注意,这并不总是完美的解决方案。它隐藏了用户已丢失其会话的事实。


推荐