引言
在实际生活中,很多网站都做了多点登录互斥的操作,简单来说就是同一个账号,只能在一台电脑上登录,如果有人在其他地方登录,那么原来登录的地方就会自动下线,再进行操作就会弹出登录界面。
实现思路
在《Web应用安全————账号冻结与 Session 实时失效》中,我们通过map 来维护一个全局的“用户名 - Session Id” 关系,这样,就可以方便的根据用户名来找到此用户的Session id。
根据Map 的特性,在调用 put 方法的时候,会覆盖相同 key 下的 value 值,因此,我们在存储 session id 前,先取出对应 用户名的 session id ,将其注销(调用stop()方法)就可以完成这一操作。
其实功能实现的整体思路和 冻结账号使 session 失效的思路基本相同,只不过冻结账号是管理员手动操作,而多点登录是通过登录操作自动触发,使原来的 session 失效。
关键代码
红框内的语句就是处理多点登录互斥的关键代码,其实就是在用户登录时去map 中查找该用户上一次使用的 session id ,再通过 Shiro 的SessionManager 的 getSession(sessionId) 查找 对应的 session 对象,判空后执行 注销操作 stop() 。
如果不清楚 CcShiroSessionIdPoolVo 的结构,可以参考《Web应用安全————账号冻结与 Session 实时失效》 ,这里就不重复解释了。
总结
其实不论账号冻结还是多点登录的互斥,都是对 用户账号的一种保护机制,避免用户的账号被不法利用。
两者实现的思路本质上是基本相同的,都是在 登录的 处理中,加入对 session 的操作,主要就是能够拿到指定用户的 session id ,然后就是找到 session ,并注销。
我个人认为难点就是如何通过指定用户找到对应的 session id,网上好像也没有类似的教程和案例,于是只能自己手动封装一个 map 来维护用户名和 session id 的关系,如果有朋友知道使用框架 api 获取指定用户 session id 的方法,欢迎文末留言探讨交流,非常感谢!