2015-07-10 6 views
0

У меня есть javascript-таймер для выхода из системы после определенного периода неактивности (когда нет движения мыши или кликов по документу).logout timer php/javascript

document.onkeypress = ResetTimer; 
document.onmousemove = ResetTimer; 
wait = 10; 
function ResetTimer() 
{ 
    time = new moment(); 
    clearTimeout(timer); 
    timer = setTimeout("Logout()", 60000 * wait); //logout the user with an ajax call 
} 

У меня также есть переменная сеанса, которая отслеживает последний раз, когда пользователь совершил php-вызов. Если пользователь не запросил ни одного запроса за 10 минут, пользователь выйдет из системы. Проблема, с которой я столкнулась, заключается в том, что если пользователь перемещается по документу, оставаясь на одной странице, он не будет отключен javascript, но PHP будет следовать его следующему запросу. Было бы хорошей практикой обновить переменную сеанса с помощью ajax-вызова через 9 минут, когда пользователь находится на одной странице (поскольку время ожидания составляет 10 минут)?

+3

Лучший шаблон для использования в сеансовых критических приложений, чтобы сделать запрос AJAX один раз в минуту или около того (в периоды бездействия), чтобы проверить, что сессия все еще активна. Если вы можете сохранить временную метку, когда сессия закончится, вы можете показать пользователю подсказку на экране, чтобы сказать что-то вроде «Ваша учетная запись будет выписана через X минут из-за неактивности. Чтобы сохранить свою сессию, нажмите здесь ». Затем кнопка будет делать другой запрос AJAX, чтобы сохранить сеанс в случае необходимости. Если запрос сделан и срок действия сеанса истек, вы можете автоматически перенаправить пользователя обратно в систему. –

+0

Не было бы лучше для пользователя, если единственное действие, требуемое для входа в систему, было бы активным на странице? –

+0

Это правда, однако сеанс хранится на сервере, в то время как активность пользователя исключительно на стороне клиента. Именно здесь AJAX будет использоваться для соединения двух. –

ответ

1

Вы можете использовать window.setInterval(). Установите функцию обратного вызова для запуска каждые 10 минут. Этот обратный вызов сбрасывает запрос Ajax на сервер и запрашивает серверное приложение для выхода из системы пользователя.

Но, всякий раз, когда пользователь взаимодействует с пользовательским интерфейсом, очищайте интервал и начинайте новый.

Таким образом, запрос на выход из системы Ajax произойдет один раз после 10 минут бездействия.

function callback() { 
    // XMLHttpRequest to logout the user. 
} 

var intervalID = setInterval(callback); 

// To cancel the interval and start a new one: 
clearInterval(intervalID); 
intervalID = window.setInterval(callback); 
1

Сделайте это в интерфейсе и сохраните запросы.

ОБНОВЛЕНИЕ: Ну, я надеюсь, что это без ошибок, это просто пример. Вам не нужно, чтобы бэкэнд для бездействия контролировал свою внешнюю ответственность, если какой-то пользователь не использует javascript, вы также не можете проверить неактивность, поэтому в худшем случае это одно и то же, контролируйте это из бэкэнд своим бессмысленным, пусть javascript выполняет всю работу. Отключите кого-то из-за неактивности, это не вещь безопасности, вам не нужна бэкэнд.

Вот как вы это делаете.

(function(d) { 
    var time = 15000 * 60; // 15' 
    var timer; 

    var setTimer = function() { 
    timer = setTimeout(function() { 
     console.log("its time to log out"); 
     // delete phpsessid 
     deleteCookie("PHPSESSID"); 
    }, time); 
    }; 

    var getEvents = function() { 
    var res = []; 
    for(var k in d) { 
     if(k.indexOf("on") === 0) { 
     res.push(k.slice(2).toLowerCase()); 
     } 
    } 
    return res; 
    }; 

    var refreshTimer = function() { 
    clearTimeout(timer); 
    console.log("clear"); 
    setTimer(); 
    }; 

    var deleteCookie = function(cname) { 
    var date = new Date(-1); 
    date.setTime(date.getTime()); 
    d.cookie = cname + "=1; " + "expires=" + date.toUTCString(); 
    }; 

    getEvents().forEach(function(evt) { 
    d.addEventListener(evt, function() { 
     refreshTimer(); 
    }); 
    }); 

    setTimer(); 
})(document); 
+0

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

+0

Если пользователь обновляется, это считается действием, и вам нужно обновить таймер, верно? Позвольте мне понять вас, вы хотите отключить пользователя, если он неактивен. Для этого вы проверяете, чтобы пользователь выполнил хотя бы одно действие в течение десяти минут. ОК? Если он освежится, он все еще там ... так что вам нужно обновить таймер ... так что я не вижу проблемы ... вам не нужны проверки бэкэнда, если он все еще там, все с JS. –

+0

На самом деле, если пользователь неактивен, удалите cookie сеанса с помощью JS, и он будет отключен автоматически, потому что PHP не может распознать его без этого файла cookie. Или токен, если вы измените это ... или, менее элегантно, отправьте запрос ajax, чтобы отключить его ... но, дело в том, вам не нужно проверять время на бэкэнд. –