java - Spring:如何动态设置最大并发 session 数

标签 java spring spring-mvc spring-security

假设我的应用有多种帐户类型,每种类型都有自己允许的最大并发 session 数。例如,如果最大值为 1,那么当用户在其台式电脑上登录时尝试从笔记本电脑登录时,他应该会收到错误消息。
我如何使用 Spring 实现这一点?我知道 concurrency-control 但据我所知它允许“静态”设置整个上下文的限制。
我在考虑 SpEL 但没有想出任何办法。

附言
我还想知道当用户超过限制时是否会抛出一个特定的异常,以便我可以处理它并显示页面以解释他无法登录的原因。

UPD
感谢@Nándor 的聪明想法:当用户尝试在另一台设备上登录时,应该要求他在当前设备或另一台设备上注销。

UPD2
我发现有一个 SessionRegistry 类的 bean|它包含所有必需的信息,还允许手动使 session 过期。我也可以用它控制 session 的数量。
但是仍然存在问题:如何通知另一台设备 session 已关闭?当我使用 SessionInformation.expireNow() 手动使 session 过期时,它会给我一个包含以下文本的页面:

This session has been expired (possibly due to multiple concurrent logins being attempted as the same user).

文本的意思正是我想要的,但我想按我的意愿处理它。我在 java.lang.Exception 上尝试了 @ExceptionHandler 但它没有捕捉到任何东西。

提前致谢!

最佳答案

谢谢 @Nándor思来想去,终于找到了解决办法。

关于管理 Activity session 的数量:

我使用 SessionRegistry bean,它可以管理所有主体的 Activity session 。此外,我认为值得一提的是,在我将安全配置从 servlet config 取消到 applicationContext.xml 之前,SessionRegistry 似乎是空的。 Spring 记录它已成功将 session ID 放入注册表,但它仍然是空的,除非它在 ​​applicationContext.xml 中声明。

关于处理 session 过期:

concurrency-control 标签有 expire-url 标签,其中包含在 session 过期时用户将被重定向到的 url。我可以将 Controller 映射到它并做我想做的事。

关于java - Spring:如何动态设置最大并发 session 数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34667857/

相关文章:

java - Spring:将一条记录添加到列表中突然创建了一条重复项

java - 将 Servlet 上下文参数传递给 Spring MVC Controller

java - spring jdbctemplate和Hibernate的区别

java - 使用 Arrays.asList 将基元数组转换为列表

使用 AggregateItemReader 或其他解决方案在阅读器中进行一次 Spring 批量读取多行

java - Spring数据查询限制作为参数

java - 有关 Spring MVC 在这两种情况下如何接收和使用 Accept Header 的一些信息

spring - 如何部署这个罕见的 Spring MVC web 应用程序?

java - 如何让JavaScript使用服务器端的变量?

java - 如何在Spring String中转义 ","(逗号)到数组或List转换