Token工具类

import io.jsonwebtoken.*;
import io.jsonwebtoken.impl.DefaultClaims;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;


/**
 * @author 
 * @title
 * @description 生成token和解析token的工具类
 * @date 2022/10/13
 **/
public class TokenUtil {
    //密钥明文I guess PeterPan was right,growing up's a waste of time.
    private static final String SECRET_CLEARTEXT = "PeterPan";
    //过期时间默认为半小时后过期
    private static final long EXPIRATION_TIME = 1000 * 60 * 30L;

    /**
     * @description 以Base64编码获取一个AES算法密钥
     * @author 
     * @date 16:22 2022/10/14
     * @return javax.crypto.SecretKey
     **/
    public static SecretKey getSecretKey() {
        //以Base64编码获取到明文密钥的字节  以该数组生成一个AES算法的的密钥
        return new SecretKeySpec(Base64.getDecoder().decode(SECRET_CLEARTEXT) ,  "AES");
    }

    /***
     * @description 获取一个无 - 作为token的唯一ID
     * @author 三文鱼先生
     * @date 16:07 2022/10/14
     * @return java.lang.String
     **/
    public static String getUUID() {
        return UUID.randomUUID().toString().replaceAll("-" , "");
    }

    /***
     * @description 以默认的过期时间构造token
     * @author 三文鱼先生
     * @date 16:07 2022/10/14
     * @param str 存放在token里的信息
     * @return java.lang.String
     **/
    public static String getToken(String str) {
        return getJwtBuilder(str).compact();
    }

    /***
     * @description 以指定的过期时间构造token
     * @author 三文鱼先生
     * @date 16:07 2022/10/14
     * @param str 存放在token里的信息
     * @param mills 指定多少毫秒后过期
     * @return java.lang.String
     **/
    public static String getToken(String str , long mills) {
        return getJwtBuilder(str , mills).compact();
    }


    /**
     * @description 获取一个JWT的构造器
     * @author 
     * @date 16:09 2022/10/14
     * @param str
     * @return io.jsonwebtoken.JwtBuilder
     **/
    public static JwtBuilder getJwtBuilder(String str) {
        if(str == null)
            throw new RuntimeException("实体数据为空");
        //获取到AES算法的密钥
        long nowMills = System.currentTimeMillis();
        DefaultClaims defaultClaims = new DefaultClaims();
        defaultClaims.put("msg" , str);
        return Jwts.builder()
                .setId(getUUID())          //唯一的ID
                .setSubject("token")       // 数据
                .setIssuer("PeterPan")     // 签发者
                .setClaims(defaultClaims)  //数据
                .setIssuedAt(new Date(nowMills))      // 签发时间设置为当前
                .signWith(SignatureAlgorithm.HS256, getSecretKey()) //使用HS256对称加密算法签名, 第二个参数为秘钥
                .setExpiration(new Date(nowMills + EXPIRATION_TIME));//设置为超时时间
    }

    /***
     * @description 获取一个token的构造器
     * @author 
     * @date 15:51 2022/10/14
     * @param str 数据
     * @param mills 过期时间
     * @return io.jsonwebtoken.JwtBuilder
     **/
    public static JwtBuilder getJwtBuilder(String str , long mills) {
        if(str == null)
            throw new RuntimeException("实体数据为空");
        //获取到AES算法的密钥
        long nowMills = System.currentTimeMillis();
        DefaultClaims defaultClaims = new DefaultClaims();
        defaultClaims.put("msg" , str);
        return Jwts.builder()//一个构造器 下面为必要属性的设置
                .setId(getUUID())           //唯一的ID
                .setSubject("token")        //主题为token
                .setIssuer("PeterPan")      // 签发者
                .setClaims(defaultClaims)   //数据存放
                .setIssuedAt(new Date(nowMills))      // 签发时间设置为当前
                .signWith(SignatureAlgorithm.HS256, getSecretKey()) //使用HS256对称加密算法签名, 第二个参数为秘钥
                .setExpiration(new Date(nowMills + mills));//设置过期时间
    }

    /**
     * @description 从给定的token中获取msg信息
     * @author 
     * @date 16:09 2022/10/14
     * @param token token
     * @return java.lang.String
     **/
    public static String getMsgFromToken(String token)
            throws UnsupportedJwtException ,//不支持的格式异常
            MalformedJwtException ,//平台jwt异常
            SignatureException,//签名异常
            ExpiredJwtException,//超时异常
            IllegalArgumentException { //非法参数异常
        return Jwts.parser()//token的语法分析器
                .setSigningKey(getSecretKey())//设置签名验证所用的密钥
                .parseClaimsJws(token)//处理token
                .getBody()//获取存入的token里的所有信息
                .get("msg").toString();//获取claims里面存放的msg数据
    }




}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Be explorer

若认可笔者文章,手头富裕望支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值