单击注销时如何从所有活动会话中注销?

Posted

技术标签:

【中文标题】单击注销时如何从所有活动会话中注销?【英文标题】:How can I logout from all active session when clicking logout? 【发布时间】:2020-05-19 01:04:48 【问题描述】:

我想在单击注销按钮时从所有活动会话中注销。我的项目由 Groovy 在 Grails 2.3.8 上开发,也使用 spring-security 1.2.7

【问题讨论】:

“所有活动会话”是什么意思 我的意思是,一个用户可以登录多个浏览器/设备,实际上我的意思是.. 【参考方案1】:

如果所有 JSESSIONID 的 cookie 在所有浏览器/选项卡/设备上都不同(我 90 90% 确信它们是不同的),那么就没有现成的方法可以为它们删除 http 会话。

虽然建立这样的机制并不是什么大不了的事。您可以使用单例缓存,例如ConcurrentHashMap,以会话 ID 为键,并以用户 ID 为值。

您可以通过HttpSessionListener 填充单例,例如here 或here

现在,如果您想删除所有用户的会话,则必须遍历地图,找到用户 ID 的所有条目并将其值设置为例如null.

另一个难题是before-filter 或-interceptor。它应该检查缓存,如果条目有null 而不是用户ID,则执行注销。

【讨论】:

以上是关于单击注销时如何从所有活动会话中注销?的主要内容,如果未能解决你的问题,请参考以下文章

从 aws cognito java 上的一个会话注销

MVC 在同一用户登录后注销所有活动会话

当用户关闭浏览器而不单击注销时销毁或取消设置会话[重复]

在我单击注销按钮之前,如何在 php 中保持会话? [复制]

如何注销单个帐户?

使用 asp.net 中的会话从帐户注销时遇到问题