我有一个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调用刷新会话变量是不是一个好习惯?
答案 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);