Spring:如何动态设置最大并发会话数

时间:2016-01-08 00:55:36

标签: java spring spring-mvc spring-security

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

P.S。
另外我想知道当用户超出限制时会抛出一个特定的异常,所以我可以处理它并向页面显示解释他无法登录的原因。

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

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

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

文字正是我想要的,但我想按照自己的意愿处理。我在@ExceptionHandler上尝试java.lang.Exception,但它没有抓到任何东西。

提前致谢!

1 个答案:

答案 0 :(得分:1)

感谢@Nándor的想法,我终于找到了解决方案。

关于管理活动会话的数量:

我使用SessionRegistry bean,它可以管理所有主体上的活动会话。此外,我认为值得一提的是,SessionRegistry似乎是空的,直到我从servlet配置到applicationContext.xml的安全配置。 Spring记录它成功地将会话ID添加到注册表,但它仍然是空的,除非它在applicationContext.xml中声明。

至于处理会话到期:

concurrency-control标记包含expire-url标记,用于保存在过期会话时将重定向到哪个用户的网址。我可以将控制器映射到它并做我想做的事。