Принудительный выход из системы, если пользователи неактивны в течение определенного периода времени - PullRequest
7 голосов
/ 21 февраля 2009

Предположим, что вы делаете банковское приложение. Если пользователи зашли на ваш сайт, как определить их неактивность и попросить их выйти из системы, если они остаются неактивными в течение определенного периода времени? Неактивный здесь означает, что они либо переключаются на другие вкладки, либо не касаются приложения браузера.

Я думаю, что думаю, что могу сделать это, регистрируя каждое движение мыши или движения клавиатуры, когда пользователи делают на КАЖДОЙ странице моего приложения. Но код будет очень уродливым и сложным в обслуживании. Есть ли другие более элегантные способы сделать это?

Ответы [ 9 ]

15 голосов
/ 05 июня 2009

Привет, ребята, это код, который я использую. Это не мое, но я изменил его до его "совершенства".

// Add the following into your HEAD section
var timer = 0;
function set_interval() {
  // the interval 'timer' is set as soon as the page loads
  timer = setInterval("auto_logout()", 10000);
  // the figure '10000' above indicates how many milliseconds the timer be set to.
  // Eg: to set it to 5 mins, calculate 5min = 5x60 = 300 sec = 300,000 millisec.
  // So set it to 300000
}

function reset_interval() {
  //resets the timer. The timer is reset on each of the below events:
  // 1. mousemove   2. mouseclick   3. key press 4. scroliing
  //first step: clear the existing timer

  if (timer != 0) {
    clearInterval(timer);
    timer = 0;
    // second step: implement the timer again
    timer = setInterval("auto_logout()", 10000);
    // completed the reset of the timer
  }
}

function auto_logout() {
  // this function will redirect the user to the logout script
  window.location = "your_logout_script.php";
}

// Add the following attributes into your BODY tag
onload="set_interval()"
onmousemove="reset_interval()"
onclick="reset_interval()"
onkeypress="reset_interval()"
onscroll="reset_interval()"

Удачи

Richard

7 голосов
/ 21 февраля 2009

Если пользователь запрашивает новые страницы / данные с вашего сервера на регулярной основе, то настройка тайм-аута сеанса в PHP должна работать для этого (при условии, что вы используете сеансы PHP).

Если проблема заключается в том, что они могли бы сидеть на одной странице в течение длительного периода времени без поездок на сервер (например, заполняя длинную форму), и вы хотите провести различие между этим и пользователем, просто переключающимся на другую окно, вы можете сделать что-то вроде использования javascript для запроса некоторых данных, используя XMLHTTPRequest каждые пять минут или около того, чтобы сохранить сеанс. Вы можете использовать события window.focus и window.onblur в javascript, чтобы остановить и перезапустить этот механизм (я думаю, что для IE есть некоторые отличия, здесь есть хорошее объяснение ).

4 голосов
/ 21 февраля 2009

Очень простой и эффективный способ сделать это, разместив что-то вроде этого в своем разделе HTML HEAD:

<META HTTP-EQUIV="refresh" CONTENT="1800;URL=logout.php?timeout"> 

Замените logout.php? Timeout на соответствующий скрипт. В приведенном выше примере, если? Timeout находится в строке запроса, я покажу им страницу входа с информацией, указывающей, что они вышли из системы из-за неактивности.

Замените 1800 временем в секундах, которое вы хотите, чтобы они оставались неактивными, прежде чем автоматически выходить из системы. Установите это в то же время, когда у вас установлен срок действия сеанса.

Редактирование. Другой простой механизм, который нужно реализовать, - это иметь переменную сеанса last_time или last_activity или что-то в том же духе и устанавливать для нее метку времени каждый раз, когда происходит активность. В большинстве моих вещей у меня есть общий файл включения, в котором я делаю это. В этом же файле вы можете проверить, что он находится в пределах ограничений, которые вы установили для активного сеанса. Если это было слишком долго - просто перенаправьте 300 на страницу выхода из системы и отобразите там соответствующее сообщение о неактивности.

Удачи!

Ian

3 голосов
/ 19 февраля 2014

Теперь мы можем улучшить наши коды до jquery


idleTime = 0;
$(document).ready(function() {

    var idleInterval = setInterval("timerIncrement()", 60000); // 1 minute //60000
    $(this).mousemove(function(e) {
        idleTime = 0;
    });
    $(this).keypress(function(e) {
        idleTime = 0;
    });

});

function timerIncrement() {

    idleTime = idleTime + 1;

    if (idleTime >= 5) {
        window.location = $('#base_url').val() + 'home/logout_user';
    }
}

2 голосов
/ 26 июня 2014

Вы можете сделать это более элегантно с подчеркиванием и jquery javascript library-

$('body').on("click mousemove keyup", _.debounce(function(){
    // logout user here
}, 1800000)) // 30 minutes inactivity
1 голос
/ 21 февраля 2009

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

0 голосов
/ 26 ноября 2016

Я взял отметку времени «сейчас» и проверял при каждом щелчке, если задержка составляет менее 3000 секунд или более миллиардов секунд, что означает, что пользователь только что вошел в систему, если нет, он будет перенаправлен на выход из системы

    var time = 0;

$(document).on('click', function() {

    var now = Date.now() / 1000 | 0;

    if (now - time < 3000 || now - time > 1480000000) {
        time = now;
    } else {
        window.location.replace("http://url");
    }
})
0 голосов
/ 22 февраля 2009

У вас может быть немного javascript, который проверяет сервер каждые x минут, чтобы увидеть, когда было последнее действие пользователя. Не должно быть больше, чем несколько строк кода. Я бы также добавил мета-обновление, если у пользователя отключен JavaScript.

0 голосов
/ 21 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...