2012-05-19 3 views
1

Вопрос звучит тихо, странно. Я знаю, но вот проблема, следующий код работает отлично. Таймер запускается через 30 минут, каждую секунду движение мыши не обнаружено, подсчитывает таймер вниз. Когда обнаружен ход мыши, таймер получает сброс до 30 минут, при 25-минутной отметке бездействия страницы всплывающее окно css показывает отсчет последних 5 минут, через 30 минут пользователь автоматически выходит из системы. Однако, если пользователь открывает страницу, но активно просматривает другую веб-страницу, таймер либо замедляется, либо полностью останавливается в зависимости от браузера. Это фактически отрицает сценарий вообще. Возможно ли, чтобы сценарий продолжал нормальный обратный отсчет и все еще вытеснял пользователя из страницы, даже если они не активно просматривали страницу? Или эти браузерные причуды уменьшают нагрузку на память?Таймер Javascript не запускается, если страница не активна. Страница:

 var Timing = 0; 
    var CounterTime = 0; 
    var TimePast = 0; 
    var Seconds = 1800; 
    var Warn = 1500; 
    var MinuteLeft = 30; 
    var SecondLeft = 60; 
    var StopRefresh = 0; 

    function ResponseTime() 
    { 
      Timing = Timing + 100; 
      CounterTime = CounterTime + 100; 
      if(Timing % 1000 == 0) 
      { 
       TimePast = TimePast + 1; 
       SecondLeft = SecondLeft - 1; 
       if(SecondLeft == 59) 
       { 
        MinuteLeft = MinuteLeft-1; 
       } 
       if(SecondLeft == 0) 
       { 
        SecondLeft = 60; 
       } 
      } 
      if(MinuteLeft != 0) 
      { 
       if(SecondLeft == 60) 
       { 
         document.getElementById('CountdownTimer').firstChild.nodeValue = MinuteLeft+":00"; 
       }else if(SecondLeft < 10) 
       { 
         document.getElementById('CountdownTimer').firstChild.nodeValue = MinuteLeft+":0"+SecondLeft; 
       }else 
       { 
         document.getElementById('CountdownTimer').firstChild.nodeValue = MinuteLeft+":"+SecondLeft; 
       } 
       if((MinuteLeft == 0) && (SecondLeft <= 10)) 
       { 
         document.getElementById('CountdownTimer').style.fontWeight = "bolder"; 
         document.getElementById('CountdownTimer').style.color = "red"; 
       } 
         document.getElementById('CountdownTimer').style.fontWeight = "normal"; 
         document.getElementById('CountdownTimer').style.color = "black"; 
       }else 
       { 
         document.getElementById('CountdownTimer').firstChild.nodeValue = SecondLeft; 
       if((MinuteLeft == 0) && (SecondLeft <= 10)) 
       { 
         document.getElementById('CountdownTimer').style.fontWeight = "bolder"; 
         document.getElementById('CountdownTimer').style.color = "red"; 
       }else 
       { 
         document.getElementById('CountdownTimer').style.fontWeight = "normal"; 
         document.getElementById('CountdownTimer').style.color = "black";   
       } 
      } 
      if(TimePast == 1800) 
      { 
       document.getElementById('DoLogoutRequest').submit(); 
      } 
      if(MinuteLeft <=4) 
      { 
       document.getElementById('Overlay').style.visibility="visible"; 
       document.getElementById('ForceLogout').style.visibility="visible"; 
      }else 
      { 
       document.getElementById('Overlay').style.visibility="hidden"; 
       document.getElementById('ForceLogout').style.visibility="hidden"; 
      } 
      $(document).ready(function(){ 
       $(document).mousemove(function(){ 
         Timing = 0; 
         TimePast = 0; 
         SecondLeft = 60; 
         MinuteLeft = 29; 
       }); 
      }); 
     } 
+0

Я не вижу никаких вызовов setInterval или setTimeout. Как вы запускаете таймер? – j08691

ответ

0

Что вы можете сделать, это изменить сценарий так, чтобы при обнаружении MouseMove, сначала проверьте текущее количество секунд (с помощью объекта Date) с момента последнего события MouseMove.

Если вам больше 30 минут, то вы знаете, что человек должен быть выведен из системы, а затем вы можете принять это действие немедленно.

Подумайте об этом как о настройке триггера, который вооружен на отметке 30 секунд, но не срабатывает, пока кто-то не отключит его.

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

Тем не менее, этот подход является творческим, поскольку он не заставляет меня посещать другую страницу. Таким образом, другой метод, который вы могли бы использовать, будет сочетать подход на стороне сервера с методом mouseevent, заключающийся в том, чтобы хранить движения мыши и время в переменной. Затем, при отметке 29:30 минут, если массив содержит движение мыши, которое произошло за последние 25 минут, сделайте безопасный запрос AJAX на сервер, чтобы сообщить сеансу, что пользователь все еще активен.

Это уменьшит нагрузку на сервер, так как вы делаете это обновление только тогда, когда это необходимо, и оно также позволит вашим пользователям использовать приложение без необходимости обновления, чтобы предотвратить выход из системы, а также будет поддерживать фактическое «Является ли пользователь зарегистрирован» частью логики, где он принадлежит, на сервере. Если сервер никогда не услышит ответ от клиента, сервер выйдет из системы.

В итоге, вместо того, чтобы ваш сервер ждет потенциально навсегда, чтобы услышать, что это нормально для входа пользователя из:

 if(TimePast == 1800) 
     { 
      document.getElementById('DoLogoutRequest').submit(); 
     } 

Сервер принимает гораздо более авторитетный подход в продвижении без вас, если это Безразлично Не слышишь, как зарегистрировался ваш клиент:

 if(TimePast <= 1800 && TimePast >= 1700) 
     { 
      // send keepalive request to the server to prevent auto-logout 

     } 
+0

Отличный момент, я буду работать над этим, спасибо! – user1401863

Смежные вопросы