package com.dg.core.manager; import com.dg.core.Constant; import io.jsonwebtoken.Claims; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.DigestUtils; import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; import java.util.UUID; import java.util.concurrent.TimeUnit; /** * 通过Redis存储和验证token的实现类 */ @Component public class RedisTokenManager implements TokenManager { private RedisTemplate redis; @Qualifier("redisTemplate") @Autowired public void setRedis(RedisTemplate redis) { this.redis = redis; //泛型设置成Long后必须更改对应的序列化方案 redis.setKeySerializer(new JdkSerializationRedisSerializer()); } @Override public String createToken(String userId, String userRole) { //使用uuid作为源token String uuid = UUID.randomUUID().toString().replace("-", ""); String token = DigestUtils.sha1DigestAsHex(uuid + userId + "e23ktjsdf") + "-" + userRole; //存储到redis并设置过期时间 redis.boundValueOps(token).set(String.valueOf(userId), Constant.TOKEN_EXPIRES_HOUR, TimeUnit.HOURS); redis.boundValueOps(String.valueOf(userId)).set(token, Constant.TOKEN_EXPIRES_HOUR, TimeUnit.HOURS); return token; } public boolean checkToken(String token) { if (StringUtils.isEmpty(token)) { return false; } String userId = redis.boundValueOps(token).get(); if (userId == null) { return false; } //如果验证成功,说明此用户进行了一次有效操作,延长token的过期时间 redis.boundValueOps(token).expire(Constant.TOKEN_EXPIRES_HOUR, TimeUnit.HOURS); return true; } /** * 验证花城token * @param token * @return */ @Override public boolean checkHCToken(String token) { if (StringUtils.isEmpty(token)) { return false; } // token解析 Claims claims = JWTTokenUtil.getClaimsFromToken(token); if (ObjectUtils.isEmpty(claims)) { return false; } String userId = claims.getSubject(); if (ObjectUtils.isEmpty(userId)) { return false; } return true; } @Override public long getUserId(String token) { if (token == null) { return -1; } String userId = redis.boundValueOps(token).get(); return Long.parseLong(userId); } /** * 获取花城e+的 UserId * @param token * @return */ @Override public long getHCUserId(String token) { if (token == null) { return -1; } // token解析 Claims claims = JWTTokenUtil.getClaimsFromToken(token); if (ObjectUtils.isEmpty(claims)) { return -1; } String userId = claims.getSubject(); if (ObjectUtils.isEmpty(userId)) { return -1; } return Long.parseLong(userId); } public void deleteToken(String token) { redis.delete(token); } @Override public String getTokenByUserId(String userId) { return redis.boundValueOps(userId).get(); } }