基于用户交互保持会话活跃的简单计划

时间:2011-12-06 14:25:51

标签: extjs session-timeout saml

我们正在与单点登录提供商合作,制作一个网页应用,需要在每个网页上都包含一个图片网址,以保持会话的有效性。如果它是一个包含多个页面的标准Web应用程序,这将非常有用,但我们正在制作一个基于extjs构建的单页面应用程序。

当我们不会请求包含他们当前使用的“跟踪像素”的页面时,寻找有关如何根据用户活动保持会话活跃的想法,因为我们所有的服务器交互都将基于json / ajax并且大部分都是将使用sencha的Ext Direct进行大多数客户端到服务器的通信。肯定有人这样做了。会话不活动计时器大约10分钟。

只是想知道是否有其他人遇到过这个问题,以及你是如何处理它的。通过setInterval调用,我可以很容易地防止会话超时,但这种情况会破坏不活动计时器的整个目的。

1 个答案:

答案 0 :(得分: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);