【问题标题】:Callback on session time out会话超时回调
【发布时间】:2013-12-09 13:21:24
【问题描述】:

这个问题可以通过谷歌搜索来解决,我也是,但由于我是 servlet 技术的新手,我无法解决这个问题。

我需要为特定用户分配会话,会话将在 10 秒后过期,当会话过期时,用户将再次被转发到 login.html 页面。

我读了一些关于它的信息,但是当会话到期时我没有收到回调。 这是我的尝试。

Login servlet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String userName = request.getParameter("user_id");
        String pwd = request.getParameter("pwd");
        PrintWriter out = response.getWriter();
        if(userName.equalsIgnoreCase(pwd)){
            HttpSession session = request.getSession();
            session.setMaxInactiveInterval(10);
            ActiveUser mActiveUser = new ActiveUser();
            mActiveUser.setUserName(userName);
            session.setAttribute("userName", mActiveUser);      
            RequestDispatcher rd = request.getRequestDispatcher("welcome.html");
            rd.forward(request, response);
        }else{
            response.setContentType("text/html");
            out.print("UserName and password did not match, Please try again");
            RequestDispatcher dispatchToIndex = request.getRequestDispatcher("index.html");
            dispatchToIndex.include(request, response);

        }
    }

ActiveUser.java

@WebListener
public class ActiveUser implements HttpSessionBindingListener,
        HttpSessionListener {
//overridden methods of the interfaces are included, and simple print statement is there to get know about callback is received or not.

问题:当会话在 10 秒后过期(超时)时,我没有收到所需的回调,但如果我在 10 秒后发送请求,它会正确地知道上一个会话已过期并且我在 @ 上收到回调987654323@

提前致谢

【问题讨论】:

    标签: java session servlets


    【解决方案1】:

    会话检查的时间间隔肯定会超过 10 秒 (HttpSessionListener not detecting session timeout)。如果你再等一会儿,sessionDestroyed 方法将被调用。

    但是,如果请求没有首先发生,则不会发生自动重定向。因此,当用户尝试访问您的 Web 应用程序时,可能会发生这种情况。在这种情况下,您不需要WebListener(例如 javax.servlet.http.HttpSessionListener),您可以简单地检查会话中是否设置了用户名或身份验证标志。

    如果你真的想要自动重定向,你可以通过 js 轮询或服务器推送来实现。

    【讨论】:

    • 我在 45-50 秒后收到了几次回调。那么,这是否意味着会话超时至少应大于 1 分钟
    • @GauravGupta 似乎检查间隔大约在那个时间,它也取决于应用服务器。
    • 我想了很久。感谢您指出根本原因。接受你的回答
    【解决方案2】:

    过期后,会话不会立即销毁。会话销毁以一定的时间间隔懒惰地发生。

    • 懒惰:当一个新的请求到达会话时,已经过期的sessionDestroyed()会被调用。
    • 在特定时间间隔:服务器运行低优先级计时器作业以清除所有过期会话。

    【讨论】:

      猜你喜欢
      • 2010-11-20
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 2010-12-05
      • 2013-09-17
      • 2010-12-29
      相关资源
      最近更新 更多