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

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

public class OnlineUserMap {
    public static Map<String , UserInfo > onlineuser = new HashMap<String , UserInfo >();

    /**
    * 得到在线用户
    * @return
    */
    public static Map<String , UserInfo > 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("当前在线的用户超过限制,请稍后再试!");
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值