【问题标题】:SPA: how to know if user's aliveSPA:如何知道用户是否还活着
【发布时间】:2014-03-18 13:14:19
【问题描述】:
我有: SPA 应用程序,这意味着它甚至可以进行离线处理。这意味着我的应用仅在需要一些额外信息或想要保存某些内容时才询问服务器。
我在 Guava Cache 中持有过期策略的用户连接。这意味着我不应该担心超时后会话破坏。
关键点: 每次用户执行某些请求时,我都会重置超时以避免会话破坏。当用户在特定时间段内处于非活动状态时,Guava Cache 会丢弃他的会话。
问题:问题与 SPA 有关。使用 SPA,如果用户不发送任何请求,并不意味着他处于非活动状态。
我想要:超时后自动关闭用户会话并注销他。
问题:我如何知道用户是否在 SPA 中处于活动状态?
【问题讨论】:
标签:
java
javascript
session
single-page-application
session-timeout
【解决方案1】:
首先想到的是在服务器端使用过期缓存之类的东西,并发送每个例如来自客户端的 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();
}
}