Проблемы с тайм-аутом сессии

Нужны ваши ценные отзывы об этом. Я реализовал функцию idletimeout, так что сессия истекает через 3 минуты, если пользователь простаивает.

В трех сценариях я сбрасываю таймер.

  1. По клику или касанию
  2. через 2 секунды во время обработки
  3. на прокрутке или скроллстарт

Иногда проблема заключается в том, что сессия получает тайм-аут раньше, чем 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();

});

В моих тестах события часто срабатывают, и таймеры сбрасываются для каждого события без проблем. Я надеюсь, что это поможет вам.

Другие вопросы по тегам