JWT工具类
一个 JWT 实际上就是一个字符串,它由三部分组成,头部、载荷与签名。前两部分需要经过 Base64 编码,后一部分通过前两部分 Base64 编码后再加密而成。具体内容可参考官方文档。
头部(Header)头部用于描述关于该 JWT 的最基本的信息
载荷(playload)载荷就是存放有效信息的地方。
这些有效信息包含三个部分:
- 标准中注册的声明(建议但不强制使用)
- 公共的声明
- 私有的声明
注意:载荷中的这3个声明并不是都要同时设置。
签证(signature)jwt的第三部分是一个签证信息。
实战入门
引入Maven依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<scope>runtime</scope>
</dependency>
创建JWT工具类
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.CompressionCodecs;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class JwtUtil {
private SecretKey tokenSignKey = Keys.hmacShaKeyFor("your_secret_key".getBytes()); // JWT加密或解密的秘钥
private String secretKey = "your_secret_key"; // JWT加密或解密的秘钥
private long expirationTime = 1000 * 60 * 60; // 1小时过期时间
// 生成JWT
public String generateToken(String id) {
Map<String, Object> claims = new HashMap<>();
return createToken(claims, id);
}
private String createToken(Map<String, Object> claims, String subject) {
return Jwts.builder()
.setClaims(claims) // 载荷-标准中注册的声明
.setSubject(subject) //设置主题
.setIssuedAt(new Date(System.currentTimeMillis())) //设置 JWT 的签发时间为当前时间
.setExpiration(new Date(System.currentTimeMillis() + expirationTime)) //设置过期时间
.signWith(SignatureAlgorithm.HS256, secretKey) //使用指定的签名算法(这里是 HS256)和密钥(secretKey)对 JWT 进行签名
.compressWith(CompressionCodecs.GZIP) //使用 GZIP 压缩 JWT,以减少其大小,便于传输。
.compact(); //构建和返回
}
// 验证JWT
public boolean validateToken(String token, String id) {
final String extractId = extractId(token);
return (extractId.equals(id) && !isTokenExpired(token));
}
// 从JWT中提取用户Id
public String extractId(String token) {
return extractAllClaims(token).getSubject();
}
// 检查JWT是否过期
public boolean isTokenExpired(String token) {
return extractAllClaims(token).getExpiration().before(new Date());
}
// 提取所有声明
private Claims extractAllClaims(String token) {
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(token)
.getBody();
}
}
使用示例
public class Main {
public static void main(String[] args) {
JwtUtil jwtUtil = new JwtUtil();
// 生成token
String token = jwtUtil.generateToken("username123");
System.out.println("Generated Token: " + token);
// 验证token
boolean isValid = jwtUtil.validateToken(token, "username123");
System.out.println("Is token valid? " + isValid);
}
}
注意事项
- 安全性:请务必使用强随机密钥,并避免使用简单的字符串作为密钥。
- 过期时间:根据您的应用需求合理设置 JWT 的过期时间。
- Claims:您可以根据需求添加其他用户相关的 Claims。