在客户端处理会话超时

Posted

技术标签:

【中文标题】在客户端处理会话超时【英文标题】:Handling Session timeout on Client side 【发布时间】:2012-04-17 02:51:19 【问题描述】:

场景是当她的会话即将过期时,用户应该收到通知(例如通过典型的 JS 警报或重定向等)。有几种方法可以做到这一点

    按照here 的说明使用javascript 超时功能。 使用Server Push 使用WebSockets 当然需要html5 支持。

这两种方法的相对优缺点是什么?除了这些,还有其他方法可以实现(一些标准库等)。我的后端是 Java EE (Struts+Spring)。

【问题讨论】:

【参考方案1】:

通过使用 javascript 超时功能,您需要确保如果用户进行任何 AJAX 调用,您的功能应该被重置,因为它应该被视为用户活动。

如果使用服务器推送使用 websockets,您可能无法定位使用不是最新浏览器的用户。您可能必须使用一些信令框架,甚至更改您的后端堆栈。 (我现在可以想到 socket.io 和 SignalR)

这两种方法都不会优雅地降级。因此,IMO javascript 选项听起来更好,因为它可以针对更广泛的受众,这需要您解决一些极端情况。如果我有选择,我根本不会实现这个功能。但这种情况几乎不会发生。

更新: 这是我能想到的另一种方法。

每次提供页面时,我都会发送一个 Cookie,该 Cookie 可以在客户端访问,其中包含会话超时的 UTC 时间。在我的代码中,我会放置一个 setInterval 来读取值并将本地时间与 UTC 进行比较,如果它关闭,将显示一个弹出窗口,说明超时将在 X 秒内发生等。

这又不会优雅地降级,而是依赖于客户端计算机的时间。因此,如果出错,此功能将无法可靠运行。

【讨论】:

【参考方案2】:

如何创建一个过滤器,在其中设置一个 cookie 以及超时前的秒数?

因此,您将始终将该值设置为 (session-config->session-timeout) * 60。

在前端,使用 setInterval,您可以通过将时间间隔减去当前 cookie 值来更新该 cookie 值,这样您就无需依赖时间配置。

【讨论】:

这样安全吗。客户端会话超时可以通过注入 js 代码(例如通过每隔(注销时间 - 1)刷新一次计数器的插件)轻松绕过

以上是关于在客户端处理会话超时的主要内容,如果未能解决你的问题,请参考以下文章

ESXi 6.5 总是会话超时

使用 Strophe 连接到 ejabberd 的 AUTHFAIL 和会话超时

ZooKeeper 会话超时

应该使用啥 http 状态代码来告诉客户端会话已超时?

zen-cart 中客户的会话超时

阿里云(ECS)Linux客户端SSH会话连接超时OperationTimedOut