在客户端处理会话超时
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)刷新一次计数器的插件)轻松绕过以上是关于在客户端处理会话超时的主要内容,如果未能解决你的问题,请参考以下文章