目前实现了security 会话并发控制 仅允许1个用户同时在线(同一账号)
但是后来发现问题 如果用户通过浏览器 主动清除session
那么再次登录就会出现登录不进去的情况
请问 有什么办法解决吗?
http://blog.csdn.net/u014756827/article/details/51305040
绑定用户登录的IP
出现这个问题的原因:手动消除cookie后与服务端就断开连接了,但是服务端的session还没有失效,这时候使用用户名密码登录时可以从session中
获取到该用户,所以提示用户已登录。
解决方案:将用户的登录IP保存在用户信息中,登录时如果session中已经该用户信息时,在检验用户的登录IP是否一样,如果一样登录成功,否则提示
用户已登录。
可能存在问题,同一个电脑上用另一个浏览器重复登录时也可以登录成功。
优化方案:同时绑定IP和浏览器信息或其它具有唯一性的信息。
spring security 有两种方法解决 仅允许1个用户同时在线(同一账号)
第一种是 : a 登陆后再进行登陆,服务器拒绝后面登陆的用户。
第二种是 : a 登陆后再进行登陆,服务器会把已登录用户踢掉,让最后登陆的用户登陆。
你这种用第二种比较好
第二种方法配置:
<session-management invalid-session-url="/sessionException?msg=SESSION.INVALID" session-fixation-protection="migrateSession" >
<!--
配置同一用户多次登录的情况, 需要重写UserDetailsServiceImpl实现类loadUserByUsername方法返回的User重写equals和hashCode,
还需要在 web.xml中配置 org.springframework.security.web.session.HttpSessionEventPublisher 监听器
max-sessions=1 配置同一用户最多可以同时登录多少次,超出后根据 error-if-maximum-exceeded 来处理
error-if-maximum-exceeded 值为true时,如果一个用户已经登录,然后又进行登录,则无法登陆,
值为false时,如果一个用户已经登录,然后又进行登录,则将踢掉上一个用户。
expired-url 表示被提出的用户跳转到那个页面
-->
<concurrency-control max-sessions="1" error-if-maximum-exceeded="false" expired-url="/sessionException?msg=SESSION.MULTI"/>
</session-management>