Простой план поддержания сеанса на основе взаимодействия с пользователем

Мы работаем с поставщиком единого входа, чтобы создать веб-приложение, которое должно включать URL-адрес изображения на каждую страницу, чтобы поддерживать сеанс. Это было бы прекрасно, если бы это было стандартное веб-приложение с несколькими страницами, но мы делаем его одностраничным приложением, построенным на extjs.

Ищем идеи о том, как поддерживать сеанс на основе активности пользователя, когда мы не будем запрашивать страницы, содержащие «пиксель отслеживания», который они используют в настоящее время, поскольку все наше взаимодействие с сервером будет основано на json/ajax, и большая часть его будет использовать Ext Direct от sencha для большей части связи между клиентом и сервером. Наверняка это сделал кто-то другой. Таймер бездействия сеанса составляет порядка 10 минут.

Просто интересно, сталкивался ли кто-нибудь с этим, и как вы с этим справились. Я могу достаточно легко предотвратить тайм-аут сеанса с помощью вызова setInterval, но это противоречит всей цели таймера бездействия.


person boatcoder    schedule 06.12.2011    source источник


Ответы (1)


Таким образом, цель состоит в том, чтобы определить, сделал ли пользователь что-то на странице за определенный период, и если да, то сделать вызов, чтобы сохранить его сеанс.

Моя идея заключается в том, что всякий раз, когда пользователь что-то делает, записывайте время, когда происходит действие. И функция проверки будет вызываться регулярно, чтобы определить, следует ли делать вызов make-session-alive.

Во-первых, сохраните две глобальные переменные:

//The time when last make-session-alive call is made.
var lastSyncTime = new Date().getTime();

//The time when user did something on the page. Reassigned per user activity.
var lastActiveTime = lastSyncTime;

Во-вторых, добавьте слушателей для записи времени активности пользователя:

function recordFn(){
   lastActiveTime = new Date().getTime();
}

//If there's a lot of clickable stuff, add a click listener to the container
Ext.getBody().on('click', recordFn);

//If there's a lot of input stuff
Ext.getBody().on('keypress', recordFn);

//If ajax call should be detected
Ext.Ajax.on('beforerequest', recordFn);

Наконец, регулярно вызывайте функцию проверки:

SessionExpiredTime = 1000 * 60 * 10; //ten minutes.
function checkFn(){
   if( lastActiveTime - lastSyncTime < SessionExpiredTime ){
     //Make Ajax call to refresh session...

     //Reassign
     lastSyncTime = new Date().getTime();
     lastActiveTime = lastSyncTime;
   }
}
setInterval(checkFn, SessionExpiredTime - 1000 * 60);
person Grant Zhu    schedule 17.01.2012
comment
Вы пропустили .getTime() здесь: function recordFn() {lastActiveTime = new Date().getTime();}? - person boatcoder; 18.01.2012
comment
Да, он отсутствует. Я изменил его. @Марк0978 - person Grant Zhu; 18.01.2012