Javascript Set интервал управления сеансом - PullRequest
0 голосов
/ 03 декабря 2009

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

Я думал о создании setInterval, который бы проверял пустую страницу, требующую аутентификации. Если таймер приближается к конечному времени, он выдает диалог, сообщающий пользователю, что сеанс близок к концу. Кнопка «оставаться в системе» сбрасывает таймер, и им также предоставляется возможность выйти из системы. Если установленный интервал получает «401» со страницы проверки, текущая страница будет обновлена ​​до экрана входа в систему.

Имеет ли это смысл? Будет ли setInterval застревать в браузере?

В качестве отступления: какой самый простой способ очистить Interval на основе взаимодействия с пользователем? Нужно ли проверять каждое нажатие клавиши и / или событие мыши? Или есть более широкий способ проверки, взаимодействует ли пользователь со страницей (например, проверка фокуса или что-то в этом роде)?

Танк.


Итак, у меня были некоторые проблемы с фреймворком, который я использую .. Обработка сеанса не очень хорошая, поэтому, похоже, возникла проблема с обновлением тайм-аута сеанса вместо того, чтобы его время ожидания всегда зависело от времени с момента входа в систему , в отличие от последней активности. Во всяком случае, с этим справились. Вопрос, который меня сейчас интересует, заключается в том, что, проверяя, аутентифицируется ли сеанс с помощью setInterval, сеанс будет обновляться с помощью проверки, поэтому время сеанса никогда не будет превышено. Или я что-то упустил?


Я решил справиться с этим только с помощью JavaScript. Установите время ожидания на never в конфигурации фреймворка, и я работаю только с setTimeout.

function alerter(msg){
    //warn user session about to expire; give opportunity to save
}
function killSess(){
    window.location = '/logout';    
}
function sessTimer(time){
timerID = window.setTimeout('killSess();',time);    
}
function observe(div){
    Event.observe(div, 'click', function(){
        clearTimeout(timerID);
        sessTimer(30000);
    });
    Event.observe('bodyDiv', 'keydown', function(e){
        clearTimeout(timerID);
        sessTimer(30000);
    });
}

Ответы [ 2 ]

1 голос
/ 03 декабря 2009

Это имеет смысл, и setInterval не будет перегружать браузер, если вы не зарегистрируете его еще раз, когда он уже зарегистрирован.

Вы хотите запускать clearInterval только по нажатию одной конкретной кнопки («нет, не опрашивать браузер» или «выйти»), поэтому я не совсем вижу проблему в вашем последнем абзаце ...

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

1 голос
/ 03 декабря 2009

Имеет ли это смысл? Будет ли setInterval завалить браузер?

Это должно работать нормально. Пока интервал достаточно велик (от нескольких секунд до минуты) и не увеличивает размер глобальной структуры данных с каждой итерацией, я не ожидаю, что он затормозит браузер.

Как в стороне: какой самый простой способ очиститьInterval на основе пользователя взаимодействие? Должен ли я проверить каждое нажатие клавиши и / или событие мыши? Или же есть ли более широкий способ проверки, если пользователь взаимодействует со страницей (например, проверка фокуса или что-то в этом роде)?

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

...