思路:
首次登陆成功, 把sessionId放入redis
redisTemplate.opsForValue().set("token_"+userId, sessionId); //id为登录账户id
后面的每次登录成功后, 都通过token_userId查询出上一次的sessionId , 然后获取session并删除。最后把本次登录的sessionId放入redis。
搞定。。。
/**
* 删除上一次的登录session
* @param sessionId 本次登录成功后的sessionId
* @param userId 用户id
*/
private void delHistory(String sessionId, Integer userId ) {
//获取上一次的sessionId
String key = redisTemplate.opsForValue().get("token_" + userId );
if(StringUtils.isNotEmpty(key)) {
//处理session
DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager();
DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager();
//得到上次的session并删除
Session session = getSessionById(key);
sessionManager.getSessionDAO().delete(session);
}
//把本次登录成功的sessionId放入redis, 与账户id关联
redisTemplate.opsForValue().set("token_"+userId , sessionId);
}
/**
* 通过sessionid获取Session
*/
public static Session getSessionById(String sessionId){
DefaultSessionKey sessionKey = new DefaultSessionKey() {
@Override
public Serializable getSessionId() {
return sessionId;
}
};
return SecurityUtils.getSecurityManager().getSession(sessionKey);
}