JWT入门学习

发布时间 2023-06-04 22:18:09作者: wzh_Official

jwt概述
JSON Web token简称JWT,是用于对应程序上的用户进行身份验证的标记,也就是说,使用JWT的应用程序不再需要保存与其有关的用户cookie或者session数据。此特性便于可伸缩性,同时保证应用程序的安全。

jwt内部结构

  1. jwt就是一个字符串,经过加密处理与校验处理的字符串,形式为:A.B.C
  2. A由jwt头部信息header加密得到
  3. B由jwt用到的身份验证信息json数据加密得到
  4. C由A和B加密得到,是校验部分

jwt鉴权流程

jwt入门案例
使用JWT工具,生成token,并将用户id和手机号码写入token中。

点击查看代码
@Test
    public void createToken(){
        //构建基础数据
        Map<String, Object> userMap = new HashMap<>();
        userMap.put("id",1);
        userMap.put("phone","18312345678");
        long now = System.currentTimeMillis();
        //使用jwt工具类,生成token
        String token = Jwts.builder().addClaims(userMap)//设置数据
                //设置加密算法,添加密钥为:wzh666
                .signWith(SignatureAlgorithm.HS256, "wzh666")
                //设置过期时间
                .setExpiration(new Date(now + 5000))
                .compact();
        System.out.println(token);
    }

解析token

点击查看代码
@Test
    public void parseToken(){
        try {
            String token="eyJhbGciOiJIUzI1NiJ9.1yJwaG9uZSI6IjE4MzEyMzQ1Njc4IiwiaWQiOjEsImV4cCI6MTY4NTg4ODI3N30.UK8NALoiCCXsAbMIyWTuoEKgJX9r5SWuWZNhXBbKNts";
            Claims claims = Jwts.parser()
                    .setSigningKey("wzh666")
                    .parseClaimsJws(token)
                    .getBody();
            Object id = claims.get("id");
            Object phone = claims.get("phone");
            System.out.println(id+"---"+phone);
        }catch (ExpiredJwtException e){
            System.err.println("token已过期");
        }catch (SignatureException e){
            System.out.println("token不合法");
        }
    }

token常见的两种异常
ExpiredJwtException:token过期
SignatureException:token不合法