使用框架:Shiro+SpringBoot
首先,我先说步骤:
1.登陆
2.查看该用户是否已经登陆 是:3 否:正常登陆
3.将已登陆用户踢出,自己登陆。
这只是说原理,具体实现现在说。
踢出已登陆用户,主要体现在对已登陆用户session的处理上,原理简单,就是将已登陆用户的session删除就好。
难点在于如何找到该用户的session。
这里,我使用了redis
首先,在登陆的时候获取用户的sessionId,也就是浏览器中的jessionId,因为我使用的是shiro框架,方法如下:
Subject user = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(phone, MD5Utils.getMD5Str(password).toCharArray()); //DigestUtils.md5Hex(password).toCharArray());//
token.setRememberMe(true);
try {
user.login(token);
user.getSession().setTimeout(-1000L); // 开发时设置永不过期,上线时需要调整 todo
} catch (UnknownAccountException e) {
logger.error("账号不存在:{}", e);
return new ChariotResponseEntity<>(ChariotHttpStatus.USER_ACCOUNT_OR_PASSWORD_ERROR);
} catch (DisabledAccountException e) {
logger.error("账号未启用:{}", e);
return new ChariotResponseEntity<>(ChariotHttpStatus.USER_NOT_ENABLED);
} catch (IncorrectCredentialsException e) {
logger.error("密码错误:{}", e);
return new ChariotResponseEntity<>(ChariotHttpStatus.USER_ACCOUNT_OR_PASSWORD_ERROR);
} catch (RuntimeException e) {
logger.error("未知错误,请联系管理员:{}" + e.toString(), e);
System.out.println(e.toString());
return new ChariotResponseEntity<>(ChariotHttpStatus.USER_OTHER_REASON);
}
SessionsSecurityManager securityManager = (SessionsSecurityManager) SecurityUtils.getSecurityManager()