记:解决创建jwt时Claims和subject之间的值被覆盖问题

在使用jjwt创建JWT时Claims和subject之间的一个小坑

  1. 在创建jwt过程中,如果前面已经设置了setSubject,后面再设置setClaims的时候,会将前面内置的subject内容覆盖掉,但是claims里面的内容可以正常显示;原因是在setClaims的方法里面,已经有setSubject,所以会将之前设置的内容覆盖掉,所以要注意使用setClaims这个方法的时候要将它移动到上面,避免覆盖。
    例如 改之前代码:
 String token = Jwts.builder().setHeaderParam("typ", "JWT")
                .setSubject("11221")
                .setClaims(map)
                .setIssuedAt(nowDate)
                .setExpiration(expireDate)
                .signWith(SignatureAlgorithm.HS256,SIGN_KEY)
                .compact();

测试结果:
在这里插入图片描述
改之后代码块:

String token = Jwts.builder().setHeaderParam("typ", "JWT")
                .setClaims(map)
                .setSubject("11221")
                .setIssuedAt(nowDate)
                .setExpiration(expireDate)
                .signWith(SignatureAlgorithm.HS256,SIGN_KEY)
                .compact();

测试结果:
在这里插入图片描述
除过移动代码位置外还有几种写法来设置Claims,即不使用 builder.setClaims(map) 封装 ,因为会覆盖前面设置的参数。
改动代码如下:

 JwtBuilder jwtBuilder = Jwts.builder().setHeaderParam("typ", "JWT")
                .setSubject("11221")
                .setIssuedAt(nowDate)
                .setExpiration(expireDate)
                .signWith(SignatureAlgorithm.HS256, SIGN_KEY);
        //第一种
        map.forEach((k,v)->{
            jwtBuilder.claim(k,v);
        });
        //第二种
        Set<String> keys = map.keySet();
        for (String key : keys){
            jwtBuilder.claim(key,map.get(key));
        }
        //第三种
        Set<Map.Entry<String, Object>> entries = map.entrySet();
        for (Map.Entry<String, Object> entry : entries){
            jwtBuilder.claim(entry.getKey(),entry.getValue());
        }
        String token1 = jwtBuilder.compact();
  1. 载荷部分存在两个属性:payload和claims。两个属性均可作为载荷,jjwt中二者只能设置其一,如果同时设置,在终端方法compact() 中将抛出异常
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一位不知名民工

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值