如下,找到session中的信息删除即可
/** * 登录认证 * @param token * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { //获取用户的输入的账号. String username = (String)token.getPrincipal(); //通过username从数据库中查找 User对象,如果找到,没找到. //实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法 LoginUser userInfo = loginUserBiz.getByName(username); if(null==userInfo){ return null; } //处理一个账号异地登录的问题,后期用户量上来需要做优化,比如登录用cas DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager(); DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager(); //获取当前已登录的用户session列表 Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions(); for(Session session:sessions){ //查找是否有当前登录账户的记录,有就清除该用户以前登录时保存的session if(userInfo.getNickName().equals(String.valueOf(session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY)))) { sessionManager.getSessionDAO().delete(session); } } //创建认证 SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( userInfo, //用户信息 userInfo.getPassword(), //密码 ByteSource.Util.bytes(userInfo.getSalt()),//passsword=MD5(pass+salt) getName() //realm name ); return authenticationInfo; }