0

我的页面上有一个用户活动。当用户处于非活动状态(没有移动鼠标)30 分钟时,它会提示用户警告会话即将到期。如果用户没有点击OK按钮并保持非活动状态将被自动注销(会话销毁)。

现在每 25 分钟检查一次,一切正常,直到用户打开同一页面的多个选项卡。如果打开了多个选项卡并且用户正在处理一个选项卡但将另一个选项卡保持打开 25 分钟,则会超时。

当多个选项卡打开并且用户在至少一个选项卡中处于活动状态时,我如何防止它超时会话,这意味着用户正在页面的至少一个选项卡中移动鼠标。

检测鼠标移动的js代码如下:

timer = 0;
function cIncrement() {
   if (timer == 25) {
     //25 minutes passed warn user that in 5 minutes it will expire
     //here is the code that prompts user with dialog
      if (OK clicked on dialog) {
        timer = 0;
      } else {
        //execute logout script.
      }
   }
   if (timer == 30) {
      //30 minutes passed log user out
      //script to log user out
   }
}

$(function() {
   var interval = setInterval("cIncrement()", 60000); //increment every minute

   //reset timer on mouse move
   $(document).mousemove(function(e) {
      timer = 0;
   });
});

注意:当打开 1 个选项卡时,上面的代码可以正常工作。

我将如何更改此设置,以便如果打开 2 个或更多选项卡并且用户在其中任何一个中处于活动状态,则应将计时器重置为0

4

1 回答 1

0

大概你有一个服务器端会话对象。大概您的服务器端会话对象也有某种到期时间,因此您可以在用户关闭浏览器或关闭笔记本电脑盖子并休假几周等的情况下获得会话。大概活动无论哪个选项卡/窗口具有焦点,都会重置您的服务器端活动超时。

因此,在 中cIncrement,发起一个 Ajax 请求,询问服务器上次活动是多久之前,并使用响应来重置timer

如果您想非常积极地保持会话打开,即使只捕获了鼠标移动,请发送页面的当前计时器值,并使用它来移动会话刷新时间(如果它是该会话中的最新活动)。

于 2013-03-13T20:59:22.913 回答