JwtUtils的工具类

package com.itheima.case2.utils;

import io.jsonwebtoken.*;
import sun.misc.BASE64Encoder;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.*;

public class AppJwtUtil {

    // TOKEN的有效期一小时(S)
    private static final int TOKEN_TIME_OUT = 3_600;
    // 密钥,不能泄露
    private static final String TOKEN_ENCRY_KEY = "MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY";

    /*
        获取token方法 :
            userId 是要存到token的用户信息, 如有需要可以添加更多
      */
    public static String getToken(Integer userId){
        Map<String, Object> claimMaps = new HashMap<>();
        claimMaps.put("userId",userId);
        long currentTime = System.currentTimeMillis();
        return Jwts.builder()
                .setId(UUID.randomUUID().toString()) //jwt编号:随机产生
                .setIssuedAt(new Date(currentTime))  //签发时间
                .setIssuer("heima") //签发者信息
                .setExpiration(new Date(currentTime + TOKEN_TIME_OUT * 1000))  //过期时间戳
                .addClaims(claimMaps) //自定义
                .signWith(SignatureAlgorithm.HS256, generalKey()) //加密方式
                .compact();
    }
    /**
     * 获取token中的claims信息
     *
     * @param token
     * @return
     */
    private static Jws<Claims> getJws(String token) {
            return Jwts.parser()
                    .setSigningKey(generalKey())
                    .parseClaimsJws(token);
    }
    /**
     * 获取payload body信息(指的是tocken中Payload部分)
     * @param token
     * @return Claims 是Map
     */
    public static Claims getClaimsBody(String token) {
        try {
            return getJws(token).getBody();
        }catch (ExpiredJwtException e){
            return null;
        }
    }
    public static JwsHeader getClaimsHeader(String token) {
        try {
            return getJws(token).getHeader();
        }catch (ExpiredJwtException e){
            return null;
        }
    }

    public static String getClaimsSignature(String token) {
        try {
            return getJws(token).getSignature();
        }catch (ExpiredJwtException e){
            return null;
        }
    }


    /**
     *
     * 检查token
     *      1. 检查tocken的完整性和有效期
     *      2. 检查失败会报错
     *      3. 检查成功返回tocken的playload内容
     */
    public static Claims checkToken(String token) {
        try {
            Claims claims = getClaimsBody(token);
            if(claims==null){
               throw new RuntimeException("token解析失败");
            }
            return claims;
        } catch (ExpiredJwtException ex) {
            throw new RuntimeException("token已经失效");
        }catch (Exception e){
            throw new RuntimeException("token解析失败");
        }
    }

    /**
     * 由字符串生成加密key
     *
     * @return
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getEncoder().encode(TOKEN_ENCRY_KEY.getBytes());
        /*
        使用len的第一个len字节构造来自给定字节数组的key ,从offset开始。
        构成密钥的字节是key[offset]和key[offset+len-1]之间的字节。

        参数
            key - 密钥的密钥材料。 将复制以offset开头的数组的第一个len字节,以防止后续修改。
            offset - 密钥材料开始的 key中的偏移量。
            len - 密钥材料的长度。
            algorithm - 与给定密钥材料关联的密钥算法的名称。 AES是一种对称加密算法
         */
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }

    //测试
//    public static void main(String[] args) {
//        String token = getToken(1);
//        System.out.println(token);
//        Claims claims = checkToken(token);
//
//        byte[] xx = Base64.getUrlDecoder().decode("eyJqdGkiOiIxZjQwYmVkOC03YjQ5LTRkYmQtYjAyNS02YTM4M2U5ZjM5ZTkiLCJpYXQiOjE2MTgxNTU2MTAsImlzcyI6ImhlaW1hIiwiZXhwIjoxNjE4MTU5MjEwLCJpZCI6MX0");
//        //{"jti":"1f40bed8-7b49-4dbd-b025-6a383e9f39e9","iat":1618155610,"iss":"heima","exp":1618159210,"id":1}
//        String s = new String(xx);
//        System.out.println(s);
//
//        byte[] yy = Base64.getUrlDecoder().decode("eyJhbGciOiJIUzI1NiJ9");
//
//        //{"jti":"1f40bed8-7b49-4dbd-b025-6a383e9f39e9","iat":1618155610,"iss":"heima","exp":1618159210,"id":1}
//        String s2 = new String(yy);
//        //{"alg":"HS256"}
//        System.out.println(s2);
//
//
//        Object userId = claims.get("userId");
//        Object iat = claims.get("iat");
//        Object exp  = claims.get("exp");
//        Object jti  = claims.get("jti");
//        Object sub   = claims.get("sub"); //没有定义的信息是获取不到的
//        System.out.println(jti);
//        System.out.println(userId);
//        System.out.println(iat);
//        System.out.println(exp);
//        System.out.println(sub);
//
//        JwsHeader header = getClaimsHeader(token);
//        String algorithm = header.getAlgorithm();
//        System.out.println(algorithm);  // HS256
//
//        String claimsSignature = getClaimsSignature(token);
//        System.out.println(claimsSignature);
//
//    }

    public static void main(String[] args) {
        /*
        *  元 : 起始
        * 元数据 : 用于描述数据的数据
        * */
            // x数据
        String header = "eyJhbGciOiJIUzI1NiJ9";
        byte[] xx = Base64.getUrlDecoder().decode(header);
        //{"alg":"HS256"}
        String s = new String(xx);
        System.out.println(s);

        String payload = "eyJqdGkiOiJmMmFiZjYzOC1hN2QxLTQwYzEtODdhZC0yNjg3NmI3NDE5OWUiLCJpYXQiOjE2MzIwMzc1ODQsImlzcyI6ImhlaW1hIiwiZXhwIjoxNjMyMDQxMTg0LCJ1c2VySWQiOjF9";
        byte[] yy = Base64.getUrlDecoder().decode(payload);
        //{"jti":"f2abf638-a7d1-40c1-87ad-26876b74199e","iat":1632037584,"iss":"heima","exp":1632041184,"userId":1}
        String s2 = new String(yy);
        System.out.println(s2);

        //userId = 1
        String token = getToken(1);
        System.out.println(token);
        Claims claims = checkToken(token);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值