SPA:如何知道用户是否还活着

时间:2014-03-18 13:14:20

标签: java javascript session single-page-application session-timeout

我有: SPA应用程序,这意味着它甚至可以进行离线处理。这意味着我的应用只询问服务器是否需要一些额外的信息或者想保存一些东西。

我在Guava Cache中拥有过期策略的用户连接。这意味着我不应该担心超时后的会话破坏。

关键点:每次用户做一些请求我都会重置超时以避免会话破坏。当用户在某个特定时间段内处于非活动状态时,Guava Cache只会抛弃他的会话。

问题:问题与SPA有关。对于SPA,如果用户不发送任何请求,则并不意味着他处于非活动状态。

我想:自动关闭用户会话,并在超时后注销他。

问题:如何知道用户在SPA中是否有效?

1 个答案:

答案 0 :(得分:0)

首先想到的是 - 在服务器端使用类似过期的缓存,并发送每个例如来自客户端的5分钟keep_alive请求表明客户端处于活动状态。但似乎是过度工程。另外,我们使用数百个不必要的请求来阻塞服务器。

所以我发现(没有意义成为先锋)更好的解决方案:客户端自己计算一个非活动期,如果inactive_period大于超时,则发送相应的请求。

activityListener = {

    timeout: null,

    activityHandler: function () {
        $.cookie('last_activity', new Date().getTime());
    },

    initialize: function (timeout) {
        this.timeout = timeout;
        $.cookie('last_activity', new Date().getTime());
        if ($.cookie('do_activity_check') != true) {
            $.cookie('do_activity_check', true);
            setInterval(this.activityCheck, timeout / 2);
        }
        addEventListener('click', this.activityHandler, false);
        addEventListener('scroll', this.activityHandler, false);
    },

    handleTimeout: function () {
        if (oLoginPage.authorities != null) {
            le.send({
                "@class": "UserRequest$Logout",
                "id": "UserRequest.Logout"
            });
        }
    },

    activityCheck: function () {
        var after_last_activity_ms = new Date().getTime() - $.cookie('last_activity');
        if (after_last_activity_ms > activityListener.timeout) activityListener.handleTimeout();
    }
}