2009-12-03 8 views
0

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

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

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

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

Tanka.


Таким образом, у меня были некоторые проблемы с основы я использую .. Обработка сеанса не очень хорошо, поэтому, казалось, проблема с обновлением сеанса timout вместо того, чтобы его тайм-аут всегда основывается на время с момента входа в систему, в отличие от последней активности. Во всяком случае, все получилось. Проблема, о которой я сейчас думаю, заключается в том, что, проверяя, завершен ли сеанс с помощью 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); 
    }); 
} 

ответ

1

ли это смысл? Будет ли setInterval запущен в браузере?

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

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

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

+0

Привет, спасибо. Я думаю, что что-то, что я не рассматривал, это то, что если я сделаю 'get' на какой-то странице auth на интервале, каждый из этих get's сбросит таймер сессии, а? – stormdrain

+0

Это правильно. Мое использование setInterval() было просто реализовать keep-alive в системе, которая во всех моих попытках увеличить тайм-аут сеанса. Может быть, вы можете использовать setInterval() для вызова скрипта, который увеличивает значение счетчика, хранящегося в сеансе, и очищает сеанс, когда значение этого счетчика больше? Кроме того, что-то нужно знать: некоторые браузеры будут кэшировать страницу, запрошенную повторно через setInterval(). Обязательно проверяйте и обходите это. Один из способов - добавить фиктивную строку запроса к URL-адресу запрашиваемой страницы и каждый раз увеличивать значение в этой строке запроса. – jkndrkn

+0

Я решил, что будет проще просто установить тайм-аут, чтобы никогда, и обрабатывать смерть сеанса исключительно с помощью javascript. Это локальная система, поэтому не слишком беспокоиться о возможных последствиях для безопасности, и это просто казалось намного проще. Спасибо за вашу помощь. – stormdrain

1

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

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

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

+0

Я предполагаю, что в последнем абзаце я имел в виду, что я хочу сбросить таймер, а не очистить его ... Таким образом, если пользователь взаимодействует со страницей, он начнет опрос на странице проверки аутентификации с 0. Но я не считал, что если я проверю аутентифицированную страницу в скрипте, сеанс останется в живых благодаря проверке страницы, чтобы узнать, жив ли сеанс. Это как рекурсия, но назад. – stormdrain

Смежные вопросы