1. 导入JWT相关依赖
<!-- jwt认证模块-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.10.2</version>
</dependency>
<!-- jwt api impl实现-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.10.2</version>
</dependency>
<!-- jwt json-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.10.2</version>
</dependency>
2. JWT生成token
/**
* 获取JWT令牌
* @return
*/
public static String getToken(String key){
Map headers = new HashMap();
//设置签名算法
headers.put("alg", "HS256");
//设置令牌类型
headers.put("typ", "JWT");
Map<String, Object> claims = new HashMap<>();
//设置令牌主题
claims.put("sub", "1234567890");
//设置令牌其他信息
claims.put("name", "John Doe");
claims.put("admin", true);
//生成令牌
String jwt = Jwts.builder()
//设置头信息
.setHeaderParams(headers)
//设置负载信息
.setClaims(claims)
//使用HS256算法和密钥对JWT进行签名
.signWith(SignatureAlgorithm.HS256,key)
//将之前设置的头部信息、负载信息和签名信息组合成一个完整的JWT,并以字符串形式返回
.compact();
System.out.println(jwt);
return jwt;
}
3. JWT解析token
/**
* 解析JWT令牌
* @param token
* @param key
*/
public static void parseToken(String token,String key){
try{
System.out.println("开始解析令牌...");
Claims claims = Jwts.parser()//创建一个解析器
.setSigningKey(key)//设置验证签名的密钥
.parseClaimsJws(token)//传入需要进行解析的token并解析
.getBody();//从Jws<Claims>对象中获取负载信息
System.out.println(claims);
}catch (Exception e){
e.printStackTrace();
}
}
4. 测试结果
public static void main(String[] args) {
String key = "3f2e1d4c5b6a79808f7e6d5c4b3a29181716151413121110";
String token = getToken(key);
parseToken(token,key);
}
输出结果:
5. JWT加密、解密工具类
/**
* 提供Jwt工具类
* 提供Token生成和验证方法
* @author Huan
*/
@Component //托管spring容器
public class JwtUtil {
// 密钥
private static final String key = "3f2e1d4c5b6a79808f7e6d5c4b3a29181716151413121110";
/**
* 生成JWT令牌
* @param payload
* @return
*/
public String getToken(Map payload){
//设置头部信息
Map headers = new HashMap();
//设置签名算法
headers.put("alg", "HS256");
//设置令牌类型
headers.put("typ", "JWT");
//生成令牌
String jwt = Jwts.builder()
//设置头信息
.setHeaderParams(headers)
//设置负载信息
.setClaims(payload)
//使用HS256算法和密钥对JWT进行签名
.signWith(SignatureAlgorithm.HS256,key)
//将之前设置的头部信息、负载信息和签名信息组合成一个完整的JWT,并以字符串形式返回
.compact();
System.out.println(jwt);
return jwt;
}
/**
* 解析JWT令牌
* @param token
* @return
*/
public Claims parseToken(String token){
try{
System.out.println("开始解析令牌...");
Claims claims = Jwts.parser()//创建一个解析器
.setSigningKey(key)//设置验证签名的密钥
.parseClaimsJws(token)//传入需要进行解析的token并解析
.getBody();//从Jws<Claims>对象中获取负载信息
System.out.println(claims);
return claims;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
链接:
JWT官方地址: https://jwt.io/
JWT官方文档: https://github.com/jwtk/jjwt
JWT官方文档快速开始: https://github.com/jwtk/jjwt?tab=readme-ov-file#quickstart