基于jwt的token自动刷新工具类

前端传过期的过来,返回一个固定的错误后,再发个刷新token的请求过来获得新的token,之后再重发请求,找了一会儿没有工具类,我就自己写个工具类中的refreshToken方法吧,下面是代码


@Component
public class JwtUtil {


    // 有效期
    private static final long JWT_EXPIRE = 24*60*60*1000L;  //1天
    // 令牌秘钥
    private static final String JWT_KEY = "FrDjoJR+wCJPW8wsjxHJ%iYKCdy20Z8mn";
    //token过期多久可以继续刷新
    private static final long Refresh_Token_Time = 24*60*60; //1天 已转化
    public static String createToken(Object data){
        // 当前时间
        long currentTime = System.currentTimeMillis();
        // 过期时间
        long expTime = currentTime+JWT_EXPIRE;
        // 构建jwt
        JwtBuilder builder = Jwts.builder()
                .setId(UUID.randomUUID()+"")
                .setSubject(JSON.toJSONString(data))
                .setIssuer("system")
                .setIssuedAt(new Date(currentTime))
                .signWith(SignatureAlgorithm.HS256, encodeSecret(JWT_KEY))
                .setExpiration(new Date(expTime));
        return builder.compact();
    }

    private static SecretKey encodeSecret(String key){
        byte[] encode = Base64.getEncoder().encode(key.getBytes());
        SecretKeySpec aes = new SecretKeySpec(encode, 0, encode.length, "AES");
        return  aes;
    }
    //解析
    public static Claims parseToken(String token){
        Claims body = Jwts.parser()
                .setSigningKey(encodeSecret(JWT_KEY))
                .parseClaimsJws(token)
                .getBody();
        return body;
    }
    //解析重载
    public static  T parseToken(String token,Class clazz){
        Claims body = Jwts.parser()
                .setSigningKey(encodeSecret(JWT_KEY))
                .parseClaimsJws(token)
                .getBody();

        return JSON.parseObject(body.getSubject(),clazz);
    }
        public static  String refreshToken(String inToken,Class clazz){
        try {
            JwtUtil.parseToken(inToken);
        } catch (ExpiredJwtException e) {
            Claims claims = e.getClaims();
            T object = JSON.parseObject(claims.getSubject(), clazz);
            //判断时间是否超过某个值
            //过期时间
            Integer createTime = (Integer) claims.get("exp");
            //当前时间
            long time = new Date().getTime();
            Integer currentTime = (int) (time/1000);
            //判断是否过期时间小于某一个值
            if(currentTime-createTime<=Refresh_Token_Time){
                //过期时间小于一天  刷新token
                String token = JwtUtil.createToken(object);
                return token;
            }
        } catch (Exception e){
            return null;
        }
        //token未过期 放回原来的token
        return inToken;
    }
}
//创建token
String token =  JwtUtil.createToken(new User);
//获取对象
User user =  JwtUtil.parseToken(token,User.class);
//刷新token
String s = JwtUtil.refreshToken(token, User.class);

你可能感兴趣的:(java,springboot)