• jjwt使用说明-笔记


    jjwt官网链接:https://github.com/jwtk/jjwt

    POM 依赖

    <dependency>
      <groupId>io.jsonwebtokengroupId>
      <artifactId>jjwt-apiartifactId>
      <version>0.12.3version>
    dependency>
    <dependency>
      <groupId>io.jsonwebtokengroupId>
      <artifactId>jjwt-implartifactId>
      <version>0.12.3version>
      <scope>runtimescope>
    dependency>
    <dependency>
      <groupId>io.jsonwebtokengroupId>
      <artifactId>jjwt-jacksonartifactId> 
      <version>0.12.3version>
      <scope>runtimescope>
    dependency>
    
    
    • 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

    生成token

    PS: 基本和java-jwt使用一致。只是最新的jjwt舍弃了一些api,换了新的api

    ① 标准载荷:
    JwtBuilder为JWT规范中定义的标准载荷提供了方便的构建器方法。
    ● issuer: sets the iss(Issuer) Claim jwt签发者
    ● subject: sets the sub(Subject) Claim jwt针对的用户
    ● audience: sets the aud(Audience) Claim 校验jwt的一方
    ● expiration: sets the exp(Expiration Time) Claim jwt过期时间
    ● notBefore: sets the nbf(Not Before) Claim 定义在某个时间前该jwt是不可用的
    ● issuedAt: sets the iat(Issued At) Claim 签发时间
    ● id: sets the jti(JWT ID) Claim jwt的唯一身份标识,作一次性token,防重放攻击。
    ② 自定义载荷:
    ● claime(key,value)
    ● claime(Map对象)

    // 创建token密钥的key,并且使用 HMAC-SHA-256 加密算法
    private static SecretKey key = Jwts.SIG.HS256.key().build();
    
    /**
     * 生成token
     * @return
     */
    public static String genToken(){
        // 2. 构建jwt,将签发人设置为joe,并且使用密钥将签名jwt生成为jws
        String jws =  Jwts.builder().
                subject("Joe").  // setSubject 设置jwt针对的用户
                issuer("张三").   // issuer 签发人
                claim("name","zhangsan"). // 自定义载荷数据
                claim("role","admin"). // 自定义载荷数据
                signWith(key).   // token加签认证
                expiration(new Date(System.currentTimeMillis()+7200*1000)). // 设置token过期时间为2H
                compact();  // 生成token字符串
        return jws;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    生成token的两句核心代码:

    SecretKey key = Jwts.SIG.HS256.key().build();
    Jwts.builder().setSubject("Joe").signWith(key).compact();
    
    • 1
    • 2

    验证解析token

     /**
     * token 校验
     * @param key  密钥
     * @param token jws
     * @return
     */
    public static String checkToken(SecretKey key,String token ){
        String msg = null;
        try {
            Jws<Claims> claimsJws = Jwts.parser().
                    verifyWith(key).
                    build().
                    parseSignedClaims(token);
            // 获取载荷的一些数据信息
            Claims payload = claimsJws.getPayload(); // payload 为一个map对象
            String issuer = payload.getIssuer();
            Date expiration = payload.getExpiration();
            String name = (String)payload.get("name");
            String role = (String)payload.get("role");
            // 测试就直接打印出去了...
            System.out.println("标准载荷:issuer===>"+issuer+"\texpiration=>"+expiration + "自定义载荷数据:"+name+"\t"+role);
            return "token正确";
        } catch (SignatureException se) {
            msg = "密钥错误";
            return  msg;
        }catch (MalformedJwtException me) {
            msg = "密钥算法或者密钥转换错误";
            return  msg;
        }catch (MissingClaimException mce) {
            msg = "密钥缺少校验数据";
            return  msg;
        }catch (ExpiredJwtException mce) {
            msg = "密钥已过期";
            return  msg;
        }catch (JwtException jwte) {
            msg = "密钥解析错误";
            return  msg;
        }
    }
    
    • 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

    完整代码

    package jwt_test;
    
    import io.jsonwebtoken.*;
    import io.jsonwebtoken.security.SignatureException;
    import javax.crypto.SecretKey;
    import java.util.Date;
    
    /**
     * jjwt
     */
    public class JJwtUtils {
    
        // 创建token密钥的key,并且使用 HMAC-SHA-256 加密算法
        private static SecretKey key = Jwts.SIG.HS256.key().build();
    
        /**
         * 生成token
         * @return
         */
        public static String genToken(){
            // 2. 构建jwt,将签发人设置为joe,并且使用密钥将签名jwt生成为jws
            String jws =  Jwts.builder().
                    subject("Joe").  // setSubject 设置jwt针对的用户
                    issuer("张三").   // issuer 签发人
                    claim("name","zhangsan"). // 自定义载荷数据
                    claim("role","admin"). // 自定义载荷数据
                    signWith(key).   // token加签认证
                    expiration(new Date(System.currentTimeMillis()+7200*1000)). // 设置token过期时间为2H
                    compact();  // 生成token字符串
            return jws;
        }
    
        /**
         * token 校验
         * @param key  密钥
         * @param token jws
         * @return
         */
        public static String checkToken(SecretKey key,String token ){
            String msg = null;
            try {
                Jws<Claims> claimsJws = Jwts.parser().
                        verifyWith(key).
                        build().
                        parseSignedClaims(token);
                // 获取载荷的一些数据信息
                Claims payload = claimsJws.getPayload(); // payload 为一个map对象
                String issuer = payload.getIssuer();
                Date expiration = payload.getExpiration();
                String name = (String)payload.get("name");
                String role = (String)payload.get("role");
                // 测试就直接打印出去了...
                System.out.println("标准载荷:issuer===>"+issuer+"\texpiration=>"+expiration + "自定义载荷数据:"+name+"\t"+role);
                return "token正确";
            } catch (SignatureException se) {
                msg = "密钥错误";
                return  msg;
            }catch (MalformedJwtException me) {
                msg = "密钥算法或者密钥转换错误";
                return  msg;
            }catch (MissingClaimException mce) {
                msg = "密钥缺少校验数据";
                return  msg;
            }catch (ExpiredJwtException mce) {
                msg = "密钥已过期";
                return  msg;
            }catch (JwtException jwte) {
                msg = "密钥解析错误";
                return  msg;
            }
        }
    
    
        /**
        * 	测试
        */
        public static void main(String[] args) {
            String token = genToken();
            System.out.println(token);
            // 断言测试
            // assert Jwts.parser().verifyWith(key).build().parseSignedClaims(token).getPayload().getSubject().equals("Joe");
            String res = checkToken(key, token);
            System.out.println(res);
        }
    
    }
    
    
    • 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

    在这里插入图片描述

  • 相关阅读:
    Java 程序猿看完这些面试题,想斩获 BAT 的 offer 都很难!
    《MongoDB入门教程》第10篇 元素运算符
    C语言学习:5、C语言程序的选择结构
    利用msg_msg实现任意地址读写
    iwebsec靶场 数据库漏洞通关2-Redis数据库漏洞
    计算机系统的层次结构
    2023 年 数维杯(C题)国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析
    Django中的事务
    在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素。
    rk3128-android7.1-遇到一个i2c错误
  • 原文地址:https://blog.csdn.net/m0_63622279/article/details/134562409