会话超时回调

时间:2013-12-09 13:21:25

标签: java session servlets

这个问题可以通过谷歌搜索解决,我也是如此,但由于我是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秒后发送请求,它会正确地知道前一个会话已过期并且我在{ {1}}

提前致谢

2 个答案:

答案 0 :(得分:1)

到期后,会话不会立即销毁。会话破坏会在一定时间间隔内发生。

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

答案 1 :(得分:1)

会话检查肯定会以超过10秒(HttpSessionListener not detecting session timeout)的间隔进行。如果等待一段时间,将调用sessionDestroyed方法。

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

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