【发布时间】: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