【问题标题】:Simple plan for keeping a session alive based on user interaction基于用户交互保持会话活动的简单计划
【发布时间】:2011-12-06 14:25:51
【问题描述】:

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

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

只是想知道是否有其他人遇到过这种情况,以及您是如何处理的。我可以通过 setInterval 调用轻松地防止会话超时,但这会破坏非活动计时器的全部目的。

【问题讨论】:

    标签: extjs session-timeout saml


    【解决方案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);
    

    【讨论】:

    • 您是否在此处遗漏了 .getTime():function recordFn() {lastActiveTime = new Date().getTime();}
    • 是的,它不见了。我已经修改过了。 @Mark0978
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2018-11-26
    • 1970-01-01
    • 2022-01-23
    • 2017-05-07
    • 2012-05-29
    相关资源
    最近更新 更多