新增token工具类:
/**
* token控制工具类
* @author 大仙
*/
public class TokenUtil {
/**
* 存储token
* @param telephone
* @param redisTemplate
* @param token
* @return
*/
public static Boolean pushToken(String telephone, RedisTemplate<String, TokenEntity> redisTemplate, String token, Date invalid){
LocalDateTime invalidDate = invalid.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
long size = redisTemplate.opsForList().size(telephone);
TokenEntity tokenEntity = new TokenEntity();
tokenEntity.setInvalidDate(invalidDate);
tokenEntity.setToken(token);
if(size<=0){
redisTemplate.opsForList().rightPush(telephone,tokenEntity);
}else{
List<TokenEntity> tokenEntities = redisTemplate.opsForList().range(telephone, 0, size);
tokenEntities = tokenEntities.stream().filter(te -> te.getInvalidDate().isAfter(LocalDateTime.now())).collect(Collectors.toList());
if(tokenEntities.size()>= Constant.MAX_LOGIN){
return false;
}
tokenEntities.add(tokenEntity);
redisTemplate.delete(telephone);
tokenEntities.forEach(te->{
redisTemplate.opsForList().rightPush(telephone,te);
});
}
return true;
}
/**
* 判断token是否有效
* @param telephone
* @param redisTemplate
* @param token
* @return true 有效 false: 无效
*/
public static Boolean judgeTokenValid(String telephone, RedisTemplate<String, TokenEntity> redisTemplate, String token){
long size = redisTemplate.opsForList().size(telephone);
if(size<=0){
return false;
}else{
List<TokenEntity> tokenEntities = redisTemplate.opsForList().range(telephone, 0, size);
tokenEntities = tokenEntities.stream().filter(te->te.getToken().equals(token)).collect(Collectors.toList());
if(CollectionUtils.isEmpty(tokenEntities)){
return false;
}
TokenEntity tokenEntity = tokenEntities.get(0);
if(tokenEntity.getInvalidDate().isAfter(LocalDateTime.now())){
return true;
}
}
return false;
}
/**
* 登出
* @param telephone
* @param redisTemplate
* @param token
*/
public static void logout(String telephone, RedisTemplate<String, TokenEntity> redisTemplate, String token){
long size = redisTemplate.opsForList().size(telephone);
if(size<=0){
redisTemplate.delete(telephone);
}else{
List<TokenEntity> tokenEntities = redisTemplate.opsForList().range(telephone, 0, size);
tokenEntities = tokenEntities.stream().filter(te->!te.getToken().equals(token)).collect(Collectors.toList());
if(CollectionUtils.isEmpty(tokenEntities)){
redisTemplate.delete(telephone);
}
redisTemplate.delete(telephone);
tokenEntities.forEach(te->{
redisTemplate.opsForList().rightPush(telephone,te);
});
}
}
}
在登录成功的时候,增加逻辑:参考:https://blog.csdn.net/zhuwei_clark/article/details/103979919
//判断token的和方法性
if(!TokenUtil.pushToken(((BaseUserDetail)authentication.getPrincipal()).getBaseUser().getTelephone(),tokenEntityRedisTemplate,token.getValue(),token.getExpiration())){
return null;
}
在退出增加逻辑:参考:https://blog.csdn.net/zhuwei_clark/article/details/103979939
TokenUtil.logout(telephone,tokenEntityRedisTemplate,accessToken);
在判断token层增加:
if(!TokenUtil.judgeTokenValid(accessTokenUtils.getUserInfo().getTelephone(),redisTemplate,accessTokenUtils.getAccessToken().getValue())){
throw new AccessDeniedException("无权限!");
}