当前位置: 首页 > 面试题库 >

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

李宜然
2023-03-14
问题内容

这个问题与我的另一个问题“ 当JavaWeb应用程序中的Session过期时如何重定向到登录页面?
”有关。以下是我要执行的操作:

  1. 我有一个在JBoss AS 5上运行的JSF Web应用程序
  2. 当用户闲置15分钟(例如15分钟)时,如果他在会话到期后尝试使用该应用程序,则需要注销该用户并将其重定向到登录页面。
  3. 因此,如“ JSF注销和重定向 ”中的建议,我实现了一个过滤器,该过滤器可检查会话过期情况,如果会话已过期,则将用户重定向到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.

有人遇到过这个问题吗?有解决这个问题的想法吗?


问题答案:

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

FacesConfig.xml中 ,放置以下内容:

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

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" />

您还可以将这种方法用于其他错误类型或异常。例如,该元素包含错误代码或异常类型与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>


 类似资料:
  • 问题内容: 我在我的应用程序中使用Spring安全功能,但是我发现,当会话过期时,所有请求ajax返回页面login.jsp(不重定向,在http响应中,它放置所有html内容)即登录页面我的webapp。我在应用程序中使用了很多ajax请求,目标是返回某些错误代码,例如510,而不是登录页面。 没有invalid-session-url,我试图使invalid-session-url =“”,不

  • 问题内容: 您如何在Java Desktop Swing应用程序中进行Hibernate会话管理?您是否使用一个会话?多个会议? 以下是有关此主题的一些参考资料: http://www.hibernate.org/333.html http://blog.schauderhaft.de/2008/09/28/hibernate-sessions-in-two-tier-rich-client-ap

  • 问题内容: 我目前正在开发我的一个(相当大的)宠物项目,这是一个Swing应用程序,它本质上需要多线程。几乎所有用户交互都可能通过Internet从某些远程服务器获取数据,因为我既不能控制这些服务器,也不能控制Internet本身,因此不可避免的是需要较长的响应时间。EDT忙时,Swing UI显然无法重绘自身,因此所有远程服务器调用都需要由后台线程执行。 我的问题: 后台线程获取的数据被本地(内

  • Javaworld Hibernate入门教程状态: 会话的实例是轻量级的,并且创建和销毁的成本很低。这很重要,因为您的应用程序需要一直创建和销毁会话,也许是在每次请求时。Hibernate会话不是线程安全的,根据设计,一次只能由一个线程使用。 由于Tomcat在多个线程中处理HTTP请求,因此线程安全在Web应用程序中是非常必要的。因此,我在回答中读到: 会话应该是每个方法的局部变量。通过这样做

  • 问题内容: 我有一个现有的Flask应用程序,并且想找到通往另一个应用程序的路线。更具体地说,第二个应用程序是Plotly Dash应用程序。如何在现有的Flask应用程序中运行Dash应用程序? 我还尝试将路由添加到Dash实例,因为它是Flask应用程序,但出现错误: 问题答案: 从文档: 基本的Flask应用程序可从访问app.server。 你还可以将自己的Flask应用实例传递到Dash

  • 我试图在SpringMVC中运行SpringBoot应用程序,在SpringMVCPOM中添加SpringBoot应用程序依赖项,并扫描SpringBoot包,但我面临以下问题