Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何动态计算会话超时?_Java_Ajax_Session_Servlets_Timeout - Fatal编程技术网

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、轮询等与客户端通信,。。。