Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.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
注销计时器php/javascript_Javascript_Php_Jquery_Ajax - Fatal编程技术网

注销计时器php/javascript

注销计时器php/javascript,javascript,php,jquery,ajax,Javascript,Php,Jquery,Ajax,我有一个javascript定时器,可以在一段时间后(当没有鼠标移动或单击文档时)注销用户 我还有一个会话变量,它跟踪用户上次进行php调用的时间。如果用户在10分钟内没有提出任何请求,则该用户将注销。我在这里遇到的问题是,如果用户在同一页面上移动文档,他不会被javascript断开连接,但PHP会在他的下一个请求中断开连接。用户在同一页面上9分钟后(因为等待时间为10分钟),使用ajax调用刷新会话变量是否是一种好的做法?在前端执行此操作并保存请求 更新: 嗯,我希望它没有bug,它只是一个

我有一个javascript定时器,可以在一段时间后(当没有鼠标移动或单击文档时)注销用户


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

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

更新: 嗯,我希望它没有bug,它只是一个例子。你不需要后端来控制不活动,这是前端的责任,如果一些用户不使用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);

您可以使用
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);

在会话关键型应用程序中使用的更好模式是每隔一分钟左右发出一次AJAX请求(在非活动期间),以检查会话是否仍然处于活动状态。如果您可以在会话到期时存储时间戳,那么您可以在屏幕上向用户显示一条提示信息,如“由于不活动,您的帐户将在X分钟内注销”。要使会话保持活动状态,请单击“此处”。如果需要,按钮将发出另一个AJAX请求以保持会话活动。如果发出请求且会话已过期,您可以自动将用户重定向回登录。如果保持登录所需的唯一操作是在页面上处于活动状态,对用户体验不是更好吗?确实如此,但是会话存储在服务器上,而用户活动仅在客户端进行。这就是AJAX用来连接两者的地方。如何在页面刷新时从JavaScript向服务器发送数据?我认为这是不可能的。如果用户刷新,这就像一个动作,你必须刷新计时器,对吗?让我了解您,如果用户处于非活动状态,您希望断开该用户的连接。为此,请检查用户在十分钟内是否至少执行了一项操作。好啊如果他恢复精神,他仍然在那里。。。所以,你必须刷新计时器。。。所以,我看不出有什么问题。。。你不需要后端检查他是否还在,用JS做所有的事情。事实上,如果用户是非活动的,用JS删除会话cookie,他将自动断开连接,因为没有cookie PHP无法识别他。或者,如果您修改了那个…,或者,不那么优雅,发送一个ajax请求来断开他的连接。。。但是,关键是,您不需要在后端检查时间。这里的问题是,如果客户端在同一页面上停留15分钟而没有断开连接,因为他移动鼠标并刷新页面,php将看到他在过去10分钟内没有提出任何php请求,因此它将注销用户。
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);