处理客户端会话超时

10
用户会话快过期时,用户应该得到通知(比如通过JS弹出框或重定向等方式)。有几种方法可以实现:
  1. 使用JavaScript的超时函数,如此处所述。
  2. 使用服务器推送,使用WebSockets,当然需要HTML5支持。
这两种方法的优缺点是什么?除此之外,是否还有其他方法可以实现(如某些标准库等)?我的后端是Java EE(Struts+Spring)。
2个回答

9
使用JavaScript超时函数,您需要确保如果用户正在进行任何AJAX调用,则应将该函数重置为其应被视为用户活动。
如果使用WebSockets使用服务器推送,则可能无法针对浏览器不是最新的用户。您可能需要使用一些信令框架甚至更改后端堆栈。(目前我可以想到socket.io&SignalR)
两种方法都不会优雅地降级。所以,在我看来,JavaScript选项听起来更好,因为它可以瞄准更广泛的受众,并且这将要求您处理一些边缘情况。如果我有选择权,我根本不会实现这个功能。但很少会这样发生。
更新: 这是我能想到的另一种方法。
每次提供页面时,我都会发送一个Cookie,客户端可以访问其中包含会话超时的UTC时间。在我的代码中,我会放置一个setInterval,它会读取值并将本地时间与UTC进行比较,如果接近,则会显示一个弹出窗口,指示超时将在X秒内发生等等。
这也没有优雅地降级,并依赖于客户端机器的时间。因此,如果错误了,此功能将无法可靠地工作。

2
创建一个筛选器,设置一个cookie,其中包含超时剩余秒数,这个cookie的值始终为(session-config->session-timeout) * 60。在前端,使用setInterval函数,通过将间隔时间减去当前cookie值来更新cookie值,这样您就不会依赖于时间配置。请保留HTML标签。

这是否安全?客户端会话超时可以通过注入JS代码来轻松绕过,例如通过刷新计数器的插件,每次刷新间隔为(注销时间-1)。 - jia chen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接