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