美文网首页
Java 实现 JWT 使用

Java 实现 JWT 使用

作者: 一滴矿泉水 | 来源:发表于2022-12-11 14:30 被阅读0次

    引入 MAVN 依赖

    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt-api</artifactId>
      <version>0.10.7</version>
    </dependency>
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt-impl</artifactId>
      <version>0.10.7</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt-jackson</artifactId>
      <version>0.10.7</version>
      <scope>runtime</scope>
    </dependency>
    

    使用 (生成 与 解析)

    public static void testJJwt(){
        // 生成密钥
        String key = "0123456789_0123456789_0123456789";
        SecretKey secretKey = new SecretKeySpec(key.getBytes(), SignatureAlgorithm.HS256.getJcaName());
    
        // 1. 生成 token
        String token = Jwts.builder()          // 创建 JWT 对象
                .setSubject("JSON Web Token")  // 设置主题(声明信息)
                .signWith(secretKey)           // 设置安全密钥(生成签名所需的密钥和算法)
                .compact(); // 生成token(1.编码 Header 和 Payload 2.生成签名 3.拼接字符串)
    
        System.out.println(token);
    
        // 2. 验证token,如果验证token失败则会抛出异常
        try {
            Jwts.parser()
                    .setSigningKey(secretKey)
                    .parseClaimsJws(token);
            // OK, we can trust this token
            System.out.println("验证成功");
        } catch (JwtException e) {
            //don't trust the token!
            System.out.println("验证失败");
        }
    
        // 3. 解析token
        Claims body = Jwts.parser()         // 创建解析对象
                .setSigningKey(secretKey)   // 设置安全密钥(生成签名所需的密钥和算法)
                .parseClaimsJws(token)      // 解析token
                .getBody();                 // 获取 payload 部分内容
        System.out.println(body);
    }
    

    日志输出

    生成token -- :eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKU09OIFdlYiBUb2tlbiJ9.QwmY_0qXW4BhAHcDpxz62v3xqkFYbg5lsZQhM2t-kVs
    验证成功
    解析数据 -- :{sub=JSON Web Token}
    

    封装 JWT 工具类

    package org.example.jjwt;
    
    import io.jsonwebtoken.*;
    
    import javax.crypto.spec.SecretKeySpec;
    import java.security.Key;
    import java.util.Date;
    import java.util.Map;
    import java.util.UUID;
    
    /**
     * @Description:
     * @Author: zhanghua
     * @DateTime: Created in 2022/12/12 1:22 PM 星期一
     */
    public class JwtUtils {
    
        /**
         * key(按照签名算法的字节长度设置key)
         */
        private final static String SECRET_KEY = "0123456789_0123456789_0123456789";
    /**
     * 过期时间(毫秒单位)
     */
    private final static long TOKEN_EXPIRE_MILLIS = 1000 * 60 * 60;
    
    /**
     * 创建token
     * @param claimMap
     * @return
     */
    public static String createToken(Map<String, Object> claimMap) {
        long currentTimeMillis = System.currentTimeMillis();
        return Jwts.builder()
                .setId(UUID.randomUUID().toString())
                .setIssuedAt(new Date(currentTimeMillis))    // 设置签发时间
                .setExpiration(new Date(currentTimeMillis + TOKEN_EXPIRE_MILLIS))   // 设置过期时间
                .addClaims(claimMap)
                .signWith(generateKey())
                .compact();
    }
    
    /**
     * 验证token
     * @param token
     * @return 0 验证成功,1、2、3、4 验证失败
     */
    public static int verifyToken(String token) {
        try {
            Jwts.parser().setSigningKey(generateKey()).parseClaimsJws(token);
            return 0;
        } catch (ExpiredJwtException e) { // 过期JWT异常
            e.printStackTrace();
            return 1;
        } catch (UnsupportedJwtException e) { // 不支持JWT异常
            e.printStackTrace();
            return 2;
        } catch (MalformedJwtException e) { // 格式不正确的JWT
            e.printStackTrace();
            return 3;
        }  catch (IllegalArgumentException e) { // 非法数据异常
            e.printStackTrace();
            return 4;
        }
    }
    
    /**
     * 解析token
     * @param token
     * @return
     */
    public static Claims parseToken(String token) {
        return Jwts.parser()  // 得到DefaultJwtParser
                .setSigningKey(generateKey()) // 设置签名密钥
                .parseClaimsJws(token)
                .getBody();
    }
    /**
     * 生成安全密钥
     * @return
     */
    public static Key generateKey() {
        return new SecretKeySpec(SECRET_KEY.getBytes(), SignatureAlgorithm.HS256.getJcaName());
    }
    

    }

    调用

    // token包含数据
    Map<String, Object> map = new HashMap<>();
    map.put("content","hello,world");
    
    // 创建token
    String token = JwtUtils.createToken(map);
    System.out.println("token --- :" + token);
    
    // 验证状态
    int jwt = JwtUtils.verifyToken(token);
    System.out.println("校验结果 --- :" + jwt);
    
    // 数据解析
    Claims claimMap = JwtUtils.parseToken(token);
    System.out.println("解析数据 --- :" + claimMap);
    

    日志输出

    token --- :eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI3NGJmOTJmNS02MDNiLTQwMGUtYjA1OC00M2E0ZmI5ZDgzYmUiLCJpYXQiOjE2NzA4MjU3OTgsImV4cCI6MTY3MDgyOTM5OCwiY29udGVudCI6ImhlbGxv77yMd29ybGQifQ.OCIc4rZijohLfXwxxKnuSv80GCjJPo_VfJWTmJ-OUC0
    校验结果 --- :0
    解析数据 --- :{jti=74bf92f5-603b-400e-b058-43a4fb9d83be, iat=1670825798, exp=1670829398, content=hello,world}
    

    文章借鉴转载链接:https://www.jianshu.com/p/344a3d5bbab6

    文章持续更新中、希望对各位有所帮助、有问题可留言 大家共同学习.

    相关文章

      网友评论

          本文标题:Java 实现 JWT 使用

          本文链接:https://www.haomeiwen.com/subject/izjfqdtx.html