1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| @Slf4j @Component public class TokenUtils {
/** * 默认过期时间(7天) */ private static final long EXPIRE_TIME = 7 * 24 * 60 * 60 * 1000L;
/** * 加密私钥 */ private static String tokenSecret;
public TokenUtils(@Value(value = "${enroll.token.secret}") String tokenSecret) { TokenUtils.tokenSecret = tokenSecret; } /** * 创建token(默认过期时间为24小时) * * @param userId 用户id * @return */ public static Token createToken(int userId) { Date expired = new Date(System.currentTimeMillis() + EXPIRE_TIME); return createTokenAndSpecifyExpirationTime(userId, expired); } /** * 创建token并指定过期时间 * * @param userId 用户id * @param expirationTime 过期时间 * @return */ public static Token createTokenAndSpecifyExpirationTime(int userId, Date expirationTime) { Date createTime = new Date(); //根据用户id,加密生成真正的token字符串 String tokenString = generateTokenString(userId, expirationTime);
Token token = new Token(); token.setUserId(userId); token.setExpired(expirationTime); token.setToken(tokenString); token.setStatus(TokenStatusEnum.EFFICIENT.getStatus()); token.setCreateTime(createTime); token.setUpdateTime(createTime);
return token; }
/** * 验证token是否有效 * * @param tokenString */ public static int verify(String tokenString) { Algorithm algorithm = Algorithm.HMAC256(tokenSecret); //根据algorithm创建JWT校验器 JWTVerifier verifier = JWT.require(algorithm).build(); //对token进行解码 DecodedJWT decodedJWT = verifier.verify(tokenString); //获取负载payload //String payload = decodedJWT.getPayload(); //String decodeStr = Base64.decodeStr(payload); //Map<String, Object> objectMap = JsonUtils.quietlyDeserializeForMap(decodeStr); Claim userId = decodedjwt.getClaim("userId"); //Integer userId = (Integer) objectMap.get("userId"); Integer userId = (Integer) userId.asString();
return userId != null ? userId : -1; }
/** * 根据用户id,加密生成真正的token字符串 * * @return */ private static String generateTokenString(int userId, Date expired) { //加密tokenSecret Algorithm algorithm = Algorithm.HMAC256(tokenSecret);
Map<String, Object> header = new HashMap<>(2); header.put("typ", "JWT"); header.put("alg", "HS256");
return JWT.create() .withHeader(header) .withIssuer("xue") //token的签发人 .withClaim("userId", userId) // 防止并发时,生成相同的token .withClaim("safe-code", UUID.randomUUID().toString().replace("-", "")) .withExpiresAt(expired) //添加过期时间 .sign(algorithm); //添加私钥 } /** * 判断token是否过期 * * @return */ public static boolean isExpiresAt(String tokenString){ Algorithm algorithm = Algorithm.HMAC256(tokenSecret);
JWTVerifier verifier = JWT.require(algorithm).build();
DecodedJWT decodedJWT = verifier.verify(tokenString);
Date expiresAt = decodedJWT.getExpiresAt();
Date day=new Date(); //day小于expiresAt时返回True return day.before(expiresAt); } }
|