你真的够努力吗?

多点登录学习

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

参考:

多点登录限制,禁止单用户多点在线

单点登录之限制同一账号在多平台同时登录

 

posted @ 2018-09-04 23:39  陈一生  阅读(4876)  评论(0编辑  收藏  举报