如何动态计算会话超时?

时间:2016-09-15 22:02:27

标签: java ajax session servlets timeout

您好我正试图从我的/logout servlet计算会话超时。我在超时之前定义了一段时间timeout

我的doPost方法在这里:

   import java.io.IOException;
   import java.util.logging.Level;
   import java.util.logging.Logger;

   import javax.servlet.ServletException;
   import javax.servlet.annotation.WebServlet;
   import javax.servlet.http.HttpServlet;
   import javax.servlet.http.HttpServletRequest;
   import javax.servlet.http.HttpServletResponse;
   import javax.ws.rs.core.MediaType;
   import com.sun.jersey.api.client.ClientResponse.Status;

   protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    long timePassed = 0;
    long timeout = 60;

    timePassed = (System.currentTimeMillis() - request.getSession().getLastAccessedTime())/1000;
    System.out.println(timePassed);

    response.setStatus(Status.OK.getStatusCode());
    response.getWriter().write("[{\"timePassed\": \""+ timePassed + "\", \"limit\": \""+ timeout + "\"}]");
    response.setContentType(MediaType.APPLICATION_JSON); 

    if(timePassed >= timeout){
        doGet(request, response);
    }

}

我通过ajax调用每秒都使用此方法。 ajax调用工作正常。 GUI工作正常,因为我在前端获取数据。但是timePassed保持为0.如何计算用户闲置的时间?

2 个答案:

答案 0 :(得分:1)

为什么不使用javascript来检测点击次数或鼠标移动?

jQuery或本机Javascript可以实现您的需求......

[编辑]

如果确定调用后端释放空闲时间,您可以使用Javascript监视这些: - )

答案 1 :(得分:1)

你得到timePassed保持为0因为,我猜你是直接调用servlet。

做一件事,在下面的代码中添加一些调试点,然后在调试模式下重启服务器。当调试器到达调试点等待5-6秒并按F8暂停调试。除了0之外,你肯定会获得timePassed的一些价值。

timePassed = (System.currentTimeMillis() - request.getSession().getLastAccessedTime())/1000;
System.out.println(timePassed);

还有一个技巧,而不是调试。当您将timePassed值设置为零时,请等待几秒钟并刷新页面(重新提交表单)。你将获得如下输出:

Session TimeOut

这是因为,当您第一次重定向到servlet时,会话时间失效为0,因为会话刚刚启动。当在同一会话中提出新请求时,失去的时间将会增加。

希望这会对你有所帮助。