多点登录学习
0x00 多点登录概念
多点登录,即用户使用应用A登录自己的账号,之后又使用应用B登录同一账号,如果这时应用A的账号经过刷新操作之后账号就被注销登录,那么这个应用对于多点登录就是有限制的。例如我们的微信账号不可以在同一移动设备同时在线。
0x01 多点登录原理
那么多点登录限制是怎么实现的呢?
以上图是根据大佬们的总结和自己的消化画出来的。重点就是口令匹配登录成功之后,进行判断当前用户是否已经登录了。
如果已经登录就需要将先登录的用户sessionid存放到另一个容器中,当下一次用户使用该sessionid进行登录时匹配到该记录就强制其下线(这是对安全要求极高的情况下,也可以选择只是提醒说“该账户已于什么时候在哪里登录”)。同时也可以对后登录的用户在正式登录之前进行提醒,如“当前账号已登录,是否确认登录”。
而如果之前未登录的情况就直接服务端生成sessionid返回给客户作为此次会话的唯一标识就好。
0x02 代码实现
我的java很菜,只能从网上找出相关代码:当登录成功后,向session中放入登录成功的账号对象loginuser,触发LoginListenner中的attributeAdded事件,在这个事件中,我们判断存放账号和session对应关系的map中是否有当前登录的账号的session,如果有我们就把该session从map中移除,同时注销该session,然后把刚登录的账号和session放入map。下面是代码:
public class LoginListenner implements HttpSessionAttributeListener { /** * 用于存放账号和session对应关系的map */ private Map<string, httpsession=""> map = new HashMap<string, httpsession="">(); /** * 当向session中放入数据触发 */ public void attributeAdded(HttpSessionBindingEvent event) { String name = event.getName(); //用户已登录 if (name.equals("loginuser")) { User user = (User) event.getValue(); if (map.get(user.getUserName()) != null) { HttpSession session = map.get(user.getUserName()); session.removeAttribute(user.getUserName()); session.invalidate(); } map.put(user.getUserName(), event.getSession()); } } /** * 当向session中移除数据触发 */ public void attributeRemoved(HttpSessionBindingEvent event) { String name = event.getName(); if (name.equals("loginuser")) { User user = (User) event.getValue(); map.remove(user.getUserName()); } } public void attributeReplaced(HttpSessionBindingEvent event) { } public Map<string, httpsession=""> getMap() { return map; } public void setMap(Map<string, httpsession=""> map) { this.map = map; } }
参考: