Java 如何动态计算会话超时?
您好,我正在尝试从我的Java 如何动态计算会话超时?,java,ajax,session,servlets,timeout,Java,Ajax,Session,Servlets,Timeout,您好,我正在尝试从我的/logoutservlet计算会话超时。我将超时之前的一定时间定义为timeout 我的doPost方法如下: import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletException; import javax.servlet.annotation.We
/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。如何计算用户空闲的时间?为什么不使用javascript来检测点击或鼠标移动
jQuery或本机Javascript可以完成您需要的功能
[编辑]
如果对后端的某些调用释放了空闲时间,您可以使用Javascript来监视这些调用:-)为什么不使用Javascript来检测单击或鼠标移动 jQuery或本机Javascript可以完成您需要的功能 [编辑]
如果对后端的某些调用释放空闲时间,您可以使用Javascript监视这些调用:-)您得到的时间传递停留时间为0,因为我猜您是直接调用servlet 做一件事,在下面的代码中添加一些调试点,然后在调试模式下重新启动服务器。当调试器到达调试点时,等待5-6秒,然后按F8暂停调试。您肯定会获得除0以外的timePassed值
timePassed = (System.currentTimeMillis() - request.getSession().getLastAccessedTime())/1000;
System.out.println(timePassed);
还有一个技巧,而不是调试。当您将timePassed值设置为零时,请等待几秒钟并刷新页面(重新提交表单)。您将获得如下输出:
这是因为,当您第一次重定向到servlet时,会话时间间隔为0,因为会话刚刚启动。当在同一个会话中提出新请求时,经过的时间将增加
希望这对您有所帮助。您得到的timePassed停留时间为0,因为我猜您是在直接调用servlet 做一件事,在下面的代码中添加一些调试点,然后在调试模式下重新启动服务器。当调试器到达调试点时,等待5-6秒,然后按F8暂停调试。您肯定会获得除0以外的timePassed值
timePassed = (System.currentTimeMillis() - request.getSession().getLastAccessedTime())/1000;
System.out.println(timePassed);
还有一个技巧,而不是调试。当您将timePassed值设置为零时,请等待几秒钟并刷新页面(重新提交表单)。您将获得如下输出:
这是因为,当您第一次重定向到servlet时,会话时间间隔为0,因为会话刚刚启动。当在同一个会话中提出新请求时,经过的时间将增加
希望这对您有所帮助。使用Ajax访问服务器算作会话访问。因此,这样做,您就可以防止会话过期。@developerwk是的,我意识到我仍然在以另一种方式进行会话。当您说idle时,您的意思是什么?有一个会话创建时间,但区别只是会话创建后的时间,而不是“空闲”。哈哈,你如何声明私有静态长超时=60;在非静态方法中。private static???@RohitGaikwad很抱歉,这是一个输入错误,使用Ajax攻击服务器将被视为会话访问。因此,这样做,您就可以防止会话过期。@developerwk是的,我意识到我仍然在以另一种方式进行会话。当您说idle时,您的意思是什么?有一个会话创建时间,但区别只是会话创建后的时间,而不是“空闲”。哈哈,你如何声明私有静态长超时=60;在非静态方法中。私人静电???@RohitGaikwad抱歉那是个打字错误是的,我知道了。但我要做的是把剩下的时间留在后面。因此,我可以跨多个选项卡维护会话并使它们保持同步。我会将其存储在存储中(数据库、文件、java中的会话对象[如果存在]),当用户再次点击服务器时,检索上次存储的日期和时间。您使用身份验证吗?数据库中存储{Key:UserX,Value:20160916 16:27}的示例。如果用户点击,则为该用户检索上次活动时间。。。如果您需要在客户端和服务器之间同步数据,请使用signar或其他lib,在这些lib中,服务器可以使用websockets、轮询等与客户端通信……是的,我找到了。但我要做的是把剩下的时间留在后面。因此,我可以跨多个选项卡维护会话并使它们保持同步。我会将其存储在存储中(数据库、文件、java中的会话对象[如果存在]),当用户再次点击服务器时,检索上次存储的日期和时间。您使用身份验证吗?数据库中存储{Key:UserX,Value:20160916 16:27}的示例。如果用户点击,则为该用户检索上次活动时间。。。如果您需要在客户端和服务器之间同步数据,请使用signar或其他lib,在这些lib中,服务器可以使用websockets、轮询等与客户端通信,。。。