web应用使用shiro控制在线人数及账号重复登录问题

1、在shiro的xml配置文件中加入sessionDAO的配置,因为在ShiroRealm.java中需要使用此对象。

   
   
   



   
   
       
       
       
   

2、在ShiroRealm.java中doGetAuthenticationInfo方法加入以下代码

                //使用@Autowired private SessionDAO sessionDao; 获取当前应用所有session。以下代码均在ShiroRealm中认证会掉函数最初加入的

                Collection sessions = sessionDao.getActiveSessions();

//根据session数量判断在线人数
if(sessions.size()>=5){
SecurityUtils.getSubject().getSession().setAttribute("msg", "线上用户名额已满,请稍后再登录");
throw new UnauthenticatedException("线上用户名额已满,请稍后再登录");
}

//获取当前登录账户 循环比对

                //注意在用户登录shiro认证成功后,需要将 userCode单独放入session中以便比对

                //例如这样:subject.getSession().setAttribute("userCode", user.getUserCode());       

                UsernamePasswordToken token2 = (UsernamePasswordToken) token;

String userCode = token2.getUsername();

int userRepeatNumber = 0;

for(Session session:sessions){         

Object o = session.getAttribute("userCode");
if(o!=null){
if(userCode.equals(o.toString())) {
userRepeatNumber ++;
if(userRepeatNumber>=1){
SecurityUtils.getSubject().getSession().setAttribute("msg", "此用户终端登录名额已满,请稍后登录");
throw new UnauthenticatedException("此用户终端登录名额已满,请稍后登录");
}
}
}
}

你可能感兴趣的:(shiro)