Предположим, что вы делаете банковское приложение. Если пользователи вошли в ваш сайт, как определить их бездействие и попросить их выйти из системы, если они остаются неактивными в течение определенного периода времени? Неактивные здесь означают, что они либо переключаются на другие вкладки, либо не касаются приложения браузера.
Думаю, я могу сделать это, зарегистрировав каждое движение мыши или движение клавиатуры, когда пользователи делают на КАЖДОЙ странице моего приложения. Но код был бы очень уродливым и неудобным. Есть ли еще более элегантные способы сделать это?
Если пользователь запрашивает новые страницы / данные с вашего сервера на регулярной основе, то настройка тайм-аута сеанса в PHP должна работать для этого (при условии, что вы используете сеансы PHP).
Если проблема состоит в том, что они могут сидеть на одной странице в течение долгого времени без каких-либо поездок на сервер (например, заполняя длинную форму), и вы хотите различать это, и пользователь просто переключается в другое окно, вы может сделать что-то вроде javascript, чтобы запросить некоторые данные с помощью XMLHTTPRequest каждые пять минут или около того, чтобы сохранить сеанс. Вы можете использовать события window.focus и window.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()"
Удачи!
Ричард
Очень простой и эффективный способ сделать это, разместив что-то вроде этого в разделе HTML HEAD:
<META HTTP-EQUIV="refresh" CONTENT="1800;URL=logout.php?timeout">
Замените тайм-аут logout.php? Соответствующим сценарием. В приведенном выше примере, если timeout находится в строке запроса, я показываю им страницу входа с информацией о том, что они были выведены из системы из-за неактивности.
Замените 1800 временем в секундах, которое вы хотите разрешить им оставаться неактивными, прежде чем автоматически их вывести из системы. Установите это значение в то же время, в котором установлено истечение срока действия сеанса.
Изменить. Еще один простой механизм для реализации – иметь переменную сеанса, называемую last_time, или last_activity, или что-то подобное вдоль этих строк, и устанавливать ее в метку времени каждый раз, когда есть активность. В большинстве моих вещей у меня есть общий файл include, в котором я делаю это. В том же файле вы можете проверить, чтобы он находился в пределах ограничений, которые вы указали для активного сеанса. Если это было слишком долго – просто перейдите на страницу выхода из системы 300 и отобразите там соответствующее сообщение о неактивности.
Удачи!
Ян
Вы можете сделать это более элегантно с помощью подстрочных и jquery- библиотек javascript –
$('body').on("click mousemove keyup", _.debounce(function(){ // logout user here }, 1800000)) // 30 minutes inactivity
Теперь мы можем улучшить код для 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'; } }
Это зависит от того, как они «вошли в систему» в первую очередь. Не делает ли это сеанс на сервере для вас? Если вы действительно хотите сделать это вручную, вы можете использовать некоторый javascript в setTimeout, но это уродливо
Обычно время жизни сеанса используется для определения того, вошел ли пользователь в систему или нет. Таким образом, вы можете установить флаг в сеансе, который представляет это состояние. И если он отсутствует (либо пользователь еще не входил в систему, либо тайм-аут сеанса), он считается не зарегистрированным.
У вас может быть несколько javascript, который проверяет сервер каждые x минут, чтобы увидеть, когда последний вид активности пользователя был. Не должно быть больше нескольких строк кода. Я также добавил бы метаобновление, если у пользователя отключен 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"); } })