我们正在与单点登录提供商合作,制作一个网页应用,需要在每个网页上都包含一个图片网址,以保持会话的有效性。如果它是一个包含多个页面的标准Web应用程序,这将非常有用,但我们正在制作一个基于extjs构建的单页面应用程序。
当我们不会请求包含他们当前使用的“跟踪像素”的页面时,寻找有关如何根据用户活动保持会话活跃的想法,因为我们所有的服务器交互都将基于json / ajax并且大部分都是将使用sencha的Ext Direct进行大多数客户端到服务器的通信。肯定有人这样做了。会话不活动计时器大约10分钟。
只是想知道是否有其他人遇到过这个问题,以及你是如何处理它的。通过setInterval调用,我可以很容易地防止会话超时,但这种情况会破坏不活动计时器的整个目的。
答案 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);