Проблемы с тайм-аутом сессии
Нужны ваши ценные отзывы об этом. Я реализовал функцию idletimeout, так что сессия истекает через 3 минуты, если пользователь простаивает.
В трех сценариях я сбрасываю таймер.
- По клику или касанию
- через 2 секунды во время обработки
- на прокрутке или скроллстарт
Иногда проблема заключается в том, что сессия получает тайм-аут раньше, чем 3 минуты, даже если я коснусь, нажму или прокручиваю, и пользователь перенаправляется на страницу входа, даже если функция вызывается по нажатию или прокрутке и вызывается resettimers. Я сталкиваюсь с немного трудным временем, чтобы выяснить лазейку.
Я публикую код; пожалуйста, дайте мне знать, если вы заметили что-нибудь.
// Set timeout variables.
var timoutNow = 180000 ;
var ua = navigator.userAgent;
var event = ((ua.match(/iPad/i)) || (ua.match(/iPhone/i)) || (ua.match(/iPod/i))) ? 'touchstart' : 'click';
var logoutUrl = Mobile+'/login.html'; // URL to logout page.
var timeoutTimer;
// Start timers.
function StartTimers() {
timeoutTimer = setTimeout("IdleTimeout()", timoutNow);
//console.log(timoutNow);
}
// Reset timers.
function ResetTimers() {
clearTimeout(timeoutTimer);
StartTimers();
}
// Processing time check.
function Laodtimercheck()
{
setInterval(function(){
if($("body").hasClass("loading-processing")==true)
{
ResetTimers();
}
}, 2000);
}
// Logout the user.
function IdleTimeout() {
sessionStorage.clear();
document.location.href = Mobile+'/login.html';
}
$(document).live(event, function(){
//console.log("Reset timers: ON TAP OR CLICK");
ResetTimers();
});
$(document).mouseover(function() {
//console.log("Reset timers: ONMOUSEOVER");
ResetTimers();
});
$(window).scroll(function() {
//console.log("Reset timers: SCROLL");
ResetTimers();
});
$(document).live("scrollstart", function(){
//console.log("Reset timers: SCROLLSTART");
ResetTimers();
});
РЕДАКТИРОВАТЬ: setTimeout работает только первые два раза; в следующий раз вызывается ResetTimers, но setTimeout не работает, или я могу что-то здесь упустить, так как время сеанса истекает, как только для двух предыдущих вызовов...
1 ответ
Настоящая проблема, с которой вы столкнулись, заключается в следующем: "ResetTimers" недостаточно вызывается. Почему недостаточно вызывается? Я постараюсь ответить на это.
Вся логика в порядке с несколькими исключениями. Есть два "проблемных" события, которые не работают или, я думаю, не работают так, как вы хотите.
1.- LIVE (событие)
Это событие не запускается никогда. Вы не можете прикрепить живое событие к документу, вам нужно указать узел, такой как html или body.
$("body").live(event, function(){
//console.log("Reset timers: ON TAP OR CLICK");
ResetTimers();
});
Поэтому при нажатии таймер не сбрасывается. Другой (и рекомендуемый) способ использования переменной для привязки событий - это использование .delegate()
, поскольку jQuery 1.4.3+
это рекомендуемый способ сделать это.
$(document).delegate("body", event, function(){
//console.log("Reset timers: ON TAP OR CLICK (delegate)");
ResetTimers();
});
Любой из них (живой на теле или делегате) будет работать, и таймер будет сброшен при нажатии или касании события.
2.- МЫШЕВЕР
С этим событием нет проблем как таковых, но я думаю, что этого будет недостаточно. MouseOver срабатывает только тогда, когда указатель попадает на экран в первый раз, если мышь не покидает окно, наведение мыши никогда не срабатывает снова. Возможно, лучшим или добавленным способом управления "зависанием мыши" на документе является использование события onmousemove. Как я уже говорил в комментарии ранее, я не знаю, хотите ли вы быть строгими в этом, поэтому я оставил вам предложение и посмотрим, соответствует ли оно вашим потребностям.
$(document).mouseover(function() {
console.log("Reset timers: ONMOUSEOVER");
ResetTimers();
});
В моих тестах события часто срабатывают, и таймеры сбрасываются для каждого события без проблем. Я надеюсь, что это поможет вам.