自己写的工具类 按照自己的理解写的注释
有不对的地方还请各位大佬指出来一下 第一次发 多多包涵
导入的依赖
<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中不要放用户重要的隐私信息