我的web应用程序使用Spring Security进行会话管理,我设置并发控制max-sessions = 1如下:
<session-management>
<concurrency-control max-sessions="1" expired-url="/login" />
</session-management>
我有如下2个测试用例
- 1)同一用户只能在PC上的2个浏览器(任何浏览器)登录。
- 2)先登录同一用户在PC上,然后在iPad (Safari)。
预期结果是第一次会话的用户将被踢出。实际结果是第一个通过,但第二个失败。当我在iPad上登录时,之前的会话不会被踢出。有人能给我一些建议吗?如何解决这个问题?我的iPad是ipad2
很可能您没有像参考手册和常见问题解答中所描述的那样添加HttpSessionEventPublisher
。
您需要的行为是默认的,但可以通过将error-if-maximum-exceeded
属性设置为true
来覆盖。
至少在spring 3.2中有一个方法maxSessionsPreventsLogin在SessionManagementConfigurer ConcurrencyControlConfigurer类。试着把它设为false,似乎你击中了它的默认行为,那是:
"如果为真,则阻止用户进行身份验证* {@ link# maximumSessions(int)}已达到"