您好我正试图从我的/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.如何计算用户闲置的时间?
答案 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值设置为零时,请等待几秒钟并刷新页面(重新提交表单)。你将获得如下输出:
这是因为,当您第一次重定向到servlet时,会话时间失效为0,因为会话刚刚启动。当在同一会话中提出新请求时,失去的时间将会增加。
希望这会对你有所帮助。