假设我有几种帐户类型的应用程序,每种类型都有自己允许的最大并发会话数。例如,如果最大值为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
,但它没有抓到任何东西。
提前致谢!
答案 0 :(得分:1)
感谢@Nándor的想法,我终于找到了解决方案。
我使用SessionRegistry
bean,它可以管理所有主体上的活动会话。此外,我认为值得一提的是,SessionRegistry
似乎是空的,直到我从servlet配置到applicationContext.xml
的安全配置。 Spring记录它成功地将会话ID添加到注册表,但它仍然是空的,除非它在applicationContext.xml
中声明。
concurrency-control
标记包含expire-url
标记,用于保存在过期会话时将重定向到哪个用户的网址。我可以将控制器映射到它并做我想做的事。