session监听,同一用户登录后,其他系统中不让此用户再次登录

最近在做一个系统,客户报出bug,用户在某系统登录后,在其他机子上也能再次登录,还能登录;解决此bug,用了网上常用的一段代码:

声明:下文代码网上比较常见,属于引用

public class OnLineUserListener implements HttpSessionListener {

    private static HashMap hUserName = new HashMap();// 保存sessionID和username的映射

    public void sessionCreated(HttpSessionEvent se) {
        // TODO Auto-generated method stub
    }

    public void sessionDestroyed(HttpSessionEvent se) {
        // TODO Auto-generated method stub
        hUserName.remove(se.getSession().getId());
    }

    public static boolean isAlreadyEnter(HttpSession session, String sUserName) {
        boolean flag = false;
        if (hUserName.containsValue(sUserName)) {// 如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中)
            flag = true;
            // 遍历原来的hUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)
            Iterator iter = hUserName.entrySet().iterator();
            while (iter.hasNext()) {
                Map.Entry entry = (Map.Entry) iter.next();
                Object key = entry.getKey();
                Object val = entry.getValue();
                if (((String) val).equals(sUserName)) {
                    hUserName.remove(key);
                }
            }
            hUserName.put(session.getId(), sUserName);// 添加现在的sessionID和username
            System.out.println("hUserName = " + hUserName);
        } else {// 如果该用户没登录过,直接添加现在的sessionID和username
            flag = false;
            hUserName.put(session.getId(), sUserName);
            System.out.println("hUserName = " + hUserName);
        }
        return flag;
    }

    /*
     * isOnline-用于判断用户是否在线
     *
     * @param session HttpSession-登录的用户名称
     *
     * @return boolean-该用户是否在线的标志
     */
    public static boolean isOnline(HttpSession session) {
        boolean flag = true;
        if (hUserName.containsKey(session.getId())) {
            flag = true;
        } else {
            flag = false;
        }
        return flag;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章