JJWT工具类和相关依赖

自己写的工具类 按照自己的理解写的注释

有不对的地方还请各位大佬指出来一下 第一次发 多多包涵

导入的依赖

<dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
</dependency>

工具类

package com.learning.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;

public class MyJwtUtil {
    //定义默认有效期为一个小时 单位:毫秒
    public static final Long JWT_Default_Expires = 60 * 60 * 1000L;

    //设置明文密钥(注意 不能含有非法字符)
    public static final String JWT_KEY = "sdfagafh";

    //签发者
    public static final String Issuer = "SmallWhite";

    /**
     * 创建一个token
     * @param id
     * @param subject   可以理解为存放实际需要传递的数据
     * @param SettingExpiresTime
     * @return
     */
    public static String createJWT(String id, String subject, Long SettingExpiresTime){
        //创建我们将要使用的JWT签名算法对(token)令牌进行签名
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        //获取当前时间并转换为date对象
        long nowMillis = System.currentTimeMillis();

        //签发时间
        Date now = new Date(nowMillis);

        //SettingExpiresTime判断用户是否需要设置token有效时间
        if (SettingExpiresTime == null) {
            //如果为空,将默认有效期赋值给SettingExpiresTime
            SettingExpiresTime = JWT_Default_Expires;
        }

        //结束时间 = 当前时间 + 设定的有效期时间
        Long ExpiresTime = nowMillis + SettingExpiresTime;
        //转换为date数据类型
        Date date = new Date(ExpiresTime);

        JwtBuilder builder = Jwts.builder()
                .setHeaderParam("typ", "JWT")    //一下两行就是Header
                .setHeaderParam("alg", "HS256")
                .setId(id)
                .setSubject(subject) //主题,可以是json数据
                .setIssuer(Issuer)   //签发者
                .setIssuedAt(now)   //签发时间
                .signWith(signatureAlgorithm,generalKey()) //使用ES256对称加密算法签名,第二个参数为加密后的明文密钥
                .setExpiration(date);   //设置过期时间

        //compact:规则构建JWT并将其序列化为紧凑的URL安全字符串
        return builder.compact();
    }

    /**
     * 加密明文密钥
     * @return
     */
    public static SecretKey generalKey(){
        //调用base64中的getDecoder方法获取解码器,调用解码器中的decode方法将明文密钥进行编码
        byte[] encodedKey = Base64.getDecoder().decode(JWT_KEY);
        //AES:加密方式
        SecretKey secretKey = new SecretKeySpec(encodedKey,0,encodedKey.length,"AES");
        //返回加密后的密钥
        return secretKey;
    }

    /**
     * 解析jwt
     * @param jwt
     * @return
     */
    //此处当解析不出的时候会抛出异常
    public static Claims parseJWT(String jwt) throws Exception{
        return Jwts.parser()    //获取jwts的解析器
                .setSigningKey(generalKey())    //设置加密后的密钥进行比对
                .parseClaimsJws(jwt)    //解析传入的jwt字符串
                .getBody();     // 拿到claims对象返回
    }


}

JWT 和 Session区别之一:Session是存储在服务器上的,token是存储在客户端上的,使用JWT可以减少服务器的压力

Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型。

Payload : 用来存放实际需要传递的数据

Signature(签名) :服务器通过 Payload、Header 和一个密钥(Secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成

JWT本质就是一组字符串,通过 ( . ) 分隔的

通常是这样的:xxxxx.yyyyy.zzzzz

第一段是对Header的一个base64编码

第二段是对Payload的一个base64编码

第三段是Header+Payload+密钥签名 组合的一个编码

也就是说密钥签名是十分重要的 如果被人知道了你的密钥签名可以解开token

另外token中不要放用户重要的隐私信息

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值