多点登陆学习

0x00 多点登陆概念

多点登陆,即用户使用应用A登陆本身的帐号,以后又使用应用B登陆同一帐号,若是这时应用A的帐号通过刷新操做以后帐号就被注销登陆,那么这个应用对于多点登陆就是有限制的。例如咱们的微信帐号不能够在同一移动设备同时在线。java

0x01 多点登陆原理

那么多点登陆限制是怎么实现的呢?安全

以上图是根据大佬们的总结和本身的消化画出来的。重点就是口令匹配登陆成功以后,进行判断当前用户是否已经登陆了。微信

若是已经登陆就须要将先登陆的用户sessionid存放到另外一个容器中,当下一次用户使用该sessionid进行登陆时匹配到该记录就强制其下线(这是对安全要求极高的状况下,也能够选择只是提醒说“该帐户已于何时在哪里登陆”)。同时也能够对后登陆的用户在正式登陆以前进行提醒,如“当前帐号已登陆,是否确认登陆”。session

而若是以前未登陆的状况就直接服务端生成sessionid返回给客户做为这次会话的惟一标识就好。this

 0x02 代码实现

  个人java很菜,只能从网上找出相关代码:当登陆成功后,向session中放入登陆成功的帐号对象loginuser,触发LoginListenner中的attributeAdded事件,在这个事件中,咱们判断存放帐号和session对应关系的map中是否有当前登陆的帐号的session,若是有咱们就把该session从map中移除,同时注销该session,而后把刚登陆的帐号和session放入map。下面是代码:spa

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; } }

参考:.net

多点登陆限制,禁止单用户多点在线3d

单点登陆之限制同一帐号在多平台同时登陆code

相关文章
相关标签/搜索