【问题标题】:Can we put condition before session timeout in spring?我们可以在春季会话超时之前设置条件吗?
【发布时间】:2016-12-24 14:10:55
【问题描述】:

我已经定义了以下处理用户会话的规则。

  • 当用户登录时,会调用 HttpSessionListener 的 sessioncreate() 并将用户状态设置为数据库中的在线。
  • 当用户注销时,HttpSessionListener 的 sessiondestroy() 将被调用,并将用户状态设置为数据库中的脱机..
  • 当用户关闭浏览器/选项卡时,在浏览器 unload/some_other 事件上进行 AJAX 调用以销毁会话。
  • 由于我们不能完全依赖浏览器事件,所以在服务器端也使用 session_timeout。在会话超时事件中,首先从服务器到客户端进行验证调用,并确认他/她是否仍然可用。如果收到客户端的确认,则表示浏览器选项卡仍处于打开状态。所以我们不会破坏会话。

在最后一条规则中,如何拦截 spring 的 session 销毁机制? 如果收到来自客户端的确认,如何跳过会话销毁?

谢谢,

【问题讨论】:

  • 澄清一下,只要浏览器打开,您是否希望会话保持活动状态?即使用户没有在屏幕上完成任何任务?
  • 是会话应该处于活动状态。我要求随机选择用户。所以在那之前他会一直等着的。
  • 由于您已经在浏览器卸载事件上发送了一些事件,因此只要 ajax 请求带有一些参数(如 action='logout')就可以通过使会话无效来在服务器端执行注销,这样更安全可以通过设置 session.setMaxInactiveInterval(15*60);//inseconds 来设置最大非活动超时时间
  • 这里我没有使用任何定期从客户端发送到服务器的 ack。它会消耗一些流量。相反,我想用户服务器到客户端请求了解客户端的状态。如果收到来自客户端的一些回复,那么即使没有活动,客户端仍然处于打开状态。除了注销/浏览器关闭之外,我不希望会话终止。

标签: java spring spring-mvc spring-security session-management


【解决方案1】:

与其在捕获 Session 超时事件后从服务器重新激活 Session,不如让我提出一个更好的方法。

由于您希望在浏览器打开时保持会话处于活动状态,即使用户没有访问(交互)站点,也可以从页面向服务器发送 Ajax ping。

这个答案就是一个例子 - https://stackoverflow.com/a/3877867/6352160

这将解决这两个问题 - 当用户关闭浏览器选项卡时自动关闭会话。只要选项卡打开,就保持会话处于活动状态。我仍然建议您保留一个 Session 变量作为计数器,并允许会话仅在固定的时间限制内打开,以避免不必要的长时间运行会话。

【讨论】:

  • 谢谢,但我不想将 ajax ping 从浏览器发送到服务器。这将消耗大量使用网站的客户的带宽。相反,我选择通过请求确认来确认客户是否仍在网站上。
  • 我可以在这里找到我的部分答案。有人可以扩展它以防止会话破坏吗?
猜你喜欢
  • 2019-05-21
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 2015-10-19
  • 2012-05-18
相关资源
最近更新 更多