javaWeb实现在线用户限制和相同账户多处登录限制

首先创建在线用户集合类:

public class OnlineUserMap {
    public static Map onlineuser = new HashMap();

    /**
    * 得到在线用户
    * @return
    */
    public static Map getOnlineuser(){
        return onlineuser;
    }

    /**
    * 添加在线用户
    * @param sessionId
    * @param userName
    * @return
    */
    public void addOnlineUser(String userId, UserInfo userinfo){
        onlineuser.put(userId, userinfo);
    }

    /**
    * 移除用户
    * @param userName
    */
    public void removeUser(String sessionId){
        for(String userId : onlineuser.keySet()){
            if(onlineuser.get(userId).getSessionId().equals(sessionId)){
                onlineuser.remove(userId);
                break;
            }
        }
    }

}

然后配置session监听器(xml文件配置省略):

public class UserLoginListener implements HttpSessionAttributeListener {

    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        // TODO Auto-generated method stub
        String username = se.getName();
        String sessionId = se.getSession().getId();
        if (username == BaseAction.SESSION_USER_INFO){
            UserInfo userInfo = (UserInfo)se.getSession().getAttribute(BaseAction.SESSION_USER_INFO);
            new OnlineUserMap().addOnlineUser(userInfo.getUserId().toString(), userInfo);
        }
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
        // TODO Auto-generated method stub
        String username = se.getName();
        String sessionId = se.getSession().getId();
        if (username == BaseAction.SESSION_USER_INFO){
            new OnlineUserMap().removeUser(sessionId);
        }
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
        // TODO Auto-generated method stub
        String username = se.getName();
        String sessionId = se.getSession().getId();
        if (username == BaseAction.SESSION_USER_INFO){
            UserInfo userInfo = (UserInfo)se.getSession().getAttribute(BaseAction.SESSION_USER_INFO);
            new OnlineUserMap().addOnlineUser(userInfo.getUserId().toString(), userInfo);
        }
    }

}

配置自定义拦截器(xml文件配置省略),在拦截器中对当前登陆用户进行判断(实现相同账户多处登陆限制):

public class CustomInterceptor implements Interceptor {

    private static final long serialVersionUID = 1L;

    public void destroy() {

    }

    public void init() {

    }

    public String intercept(ActionInvocation invocation) throws Exception {
        if (invocation.getAction() instanceof BaseAction) {
            BaseAction baseAction = (BaseAction) invocation.getAction();
            Userinfo userInfo = (UserInfo) getSession().getAttribute(SESSION_USER_INFO);
            if (userInfo == null) 
                throw new NotLogedInException();//未登录
            UserInfo loginuserinfo = new OnlineUserMap().onlineuser.get(userInfo.getUserId());//当前登陆的Session/User
            if(!loginuserinfo.getSessionId().equals(getSession().getId())){//用户在别的地方登陆
                getSession().setAttribute(SESSION_USER_INFO, null);
                getSession().setAttribute(KICKOUT_MESSAGE, "用户" + userInfo.getName() + "已在地址‘"+
            loginuserinfo.getIp()+"’重新登陆,当前登陆失效!");
                throw new NotLogedInException();//未登录
            }

        } else {
            return invocation.invoke();
        }
    }
}

实现当前在线用户限制:
在登陆处加上判断即可:

if(new OnlineUserMap().onlineuser.keySet().size() > 50){
        writeJson("当前在线的用户超过限制,请稍后再试!");
}

你可能感兴趣的:(javaWeb)