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

HttpSession超时后重定向

舒永嘉
2023-03-14
问题内容

我一直在寻找有关该主题的许多文章,但找不到适合我的解决方案。

我正在将Java EE 6与JSF 2.0结合使用(在JBoss AS 7.1上部署)

在我的web.xml我有:

    <session-config>
        <session-timeout>1</session-timeout>
    </session-config>

并且我 希望在会话自动超时时将用户重定向到登录页面。

我尝试过的

方法1:使用过滤器

我尝试了以下过滤器:

@WebFilter()
public class TimeOutFilter implements Filter {

        @Override
        public void init(FilterConfig filterConfig) throws ServletException { 
        }

        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
        ServletException {
        System.out.println("filter called");
        final HttpServletRequest req = (HttpServletRequest) request;
        final HttpSession session = req.getSession(false);
        if (session != null && !session.isNew()) {
            chain.doFilter(request, response);
        } else {
            System.out.println("Has timed out");
            req.getRequestDispatcher("/logon.xthml").forward(request, response);
        }
    }

    @Override
    public void destroy() {
    }
}

web.xml我尝试过的

<filter-mapping>
    <filter-name>TimeOutFilter</filter-name>
    <url-pattern>*.xhtml</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>TimeOutFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

过滤器在每次请求时都会被调用(在控制台中记录“被调用的适配器”)。 但是,会话超时时不会调用它。

方法2:HttpSessionLister

我尝试使用HttpSessionListerner。该方法称为具有以下签名:

public void sessionDestroyed(HttpSessionEvent se) {
}

我无法重定向到特定页面。当我想重定向用户时,通常使用NavigationHandlerfrom中的,FacesContext但是在这种情况下,没有FacesContextFacesContext.getCurrentInstance()return
null)。

根据这篇文章,HttpListener不能重定向用户,因为它不是请求的一部分。

解决此问题的最佳方法是什么?如何使上述两种方法之一起作用?


问题答案:

只要客户端未发送HTTP请求,您就无法发送HTTP响应。就那么简单。这就是HTTP的工作方式。如果任何网站能够在客户端未请求的情况下毫不客气地推送HTTP响应,则Internet看起来将大为不同。

基于一个JavaScript心跳基于类似的回答客户端的键盘/鼠标活动在这里,或间refresh头部等作为回答在这里),如果你已经基本上是一个单页web应用(因此,你不能有效使用会话范围将是解决办法(但视图范围),但是如果您在同一会话中的多个标签/窗口中打开了该页面,则效果将不佳。

从理论上讲,Websocket是将某些内容推送到客户端的正确解决方案,但这又需要一个活动会话。鸡鸡蛋问题。而且,它在当前仍相对广泛使用的旧版浏览器中将无法正常工作,因此当前仅应将其用于渐进式增强。



 类似资料:
  • 我使用的是和和。一切都很好,但是当会话超时的时候,我会得到以下错误”,因为我已经在布局的main.gsp文件中调用了session变量。现在,我希望在每次会话超时后重定向到登录页面,并且不显示错误页面。要在会话超时后重定向,我已经在文件中这样做了 但是有这么多页,所以很难写每一页。还有其他的方法做这件事吗?请帮忙。

  • 我在global.asax中尝试了以下代码,但不起作用,并导致Application_Error(“响应在此上下文中不可用。”)。

  • 问题内容: 要在网站上显示某个功能,该功能会在3秒左右的时间内将您重定向到该网站,我该怎么办? 问题答案:

  • 我想通过我的代码将用户重定向到会话超时页。我可以在过滤器中写什么逻辑,检查会话是否超时,并将用户重定向到那个定制页面(比如CustomSessionTimeout.jsp)。此页面不必经过任何筛选。 这是第一个过滤器中的一个方法的签名 public void doFilter(ServletRequest ServletRequest,ServletResponse ServletResponse

  • 我有以下HTML+js代码: 您能解释一下如何重构以下代码,在单击href code后执行,但#不添加到URL并且页面不应该重新加载的代码吗?

  • 问题内容: 在一段时间后,有一些用于重定向的PHP函数。我在某处看到它,但记不起来了。就像登录后的gmail重定向一样。请有人提醒我吗? 问题答案: header( “refresh:5;url=wherever.php” ); 这是php的设置方式,它将在 5秒内* 将您重定向到 * 请记住,必须先通过常规HTML标记,文件中的空白行或从PHP发送任何实际输出,然后调用header()。读取包含