注销计时器php / javascript

时间:2015-07-10 19:34:27

标签: javascript php jquery ajax

我有一个javascript计时器,用于在一段时间无效后退出用户(当没有鼠标移动或点击文档时)。

document.onkeypress = ResetTimer;
document.onmousemove = ResetTimer;
wait = 10;
function ResetTimer()
{
    time = new moment();
    clearTimeout(timer);
    timer = setTimeout("Logout()", 60000 * wait); //logout the user with an ajax call
}

我还有一个会话变量,用于跟踪用户上次进行php调用的时间。如果用户在10分钟内未发出任何请求,则该用户已注销。我在这里遇到的问题是,如果用户在停留在同一页面上移动文档时,他不会被javascript断开连接,但PHP会在他的下一个请求中。用户在同一页面上9分钟后(因为等待时间是10分钟),用ajax调用刷新会话变量是不是一个好习惯?

2 个答案:

答案 0 :(得分:1)

在前端执行此操作并保存请求。

更新: 好吧,我希望它没有错误,它只是一个例子。你不需要后端用于不活动控制它的前端责任,如果有些用户不使用javascript你也不能检查不活动那么,在最坏的情况下是相同的,从后端控制这个毫无意义,让javascript做所有的工作。

指出,由于不活动而导致某人失去联系,这不是安全问题。

这是你如何做到的。

(function(d) {
  var time = 15000 * 60; // 15'
  var timer;

  var setTimer = function() {
    timer = setTimeout(function() {
      console.log("its time to log out");
      // delete phpsessid
      deleteCookie("PHPSESSID");
    }, time);
  };

  var getEvents = function() {
    var res = [];
    for(var k in d) {
      if(k.indexOf("on") === 0) {
        res.push(k.slice(2).toLowerCase());
      }
    }
    return res;
  };

  var refreshTimer = function() {
    clearTimeout(timer);
    console.log("clear");
    setTimer();
  };

  var deleteCookie = function(cname) {
    var date = new Date(-1);
    date.setTime(date.getTime());
    d.cookie = cname + "=1; " + "expires=" + date.toUTCString();
  };

  getEvents().forEach(function(evt) {
    d.addEventListener(evt, function() {
      refreshTimer();
    });
  });

  setTimer();
})(document);

答案 1 :(得分:1)

您可以使用window.setInterval()。设置回调函数每10分钟运行一次。该回调将触发对服务器的Ajax请求,并请求服务器端应用程序注销该用户。

但是,每当用户与UI交互时,请清除间隔并开始新的间隔。

因此,注销Ajax请求将在10分钟不活动后发生一次。

function callback() {
    // XMLHttpRequest to logout the user.
}

var intervalID = setInterval(callback);

// To cancel the interval and start a new one:
clearInterval(intervalID);
intervalID = window.setInterval(callback);