Принудительный выход пользователей, если пользователи неактивны в течение определенного периода времени

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

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

9 ответов


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

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


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

// 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()"

Goo удачи

Ричард


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

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

замените выход из системы.РНР?тайм-аут с соответствующим скриптом .. В приведенном выше примере, если ?timeout находится в строке запроса, я показываю им страницу входа с информацией, указывающей, что они вышли из системы из-за бездействия.

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

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

удачи!

Иэн


мы можем улучшить наши коды для 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';
    }
}


вы можете сделать это более изящно с подчеркивание и в jQuery библиотеки javascript -

$('body').on("click mousemove keyup", _.debounce(function(){
    // logout user here
}, 1800000)) // 30 minutes inactivity

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


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


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


Я взял метку времени "сейчас" и проверяю каждый клик, Если задержка меньше 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");
    }
})