Spring Security 入门与实战指南(第四版,完结)
https://github.com/WuSangui571/SpringSecurity 中的 README.md 文件浏览,此处发表的是经由 GPT 润色过的精简版。
第 9 章 JWT(JSON Web Token)
9.1 概述
标准:RFC 7519,JSON 格式,常用于无状态身份认证。
结构:三段以
.分隔,Header.Payload.Signature。
9.2 三段含义
Header(头部):元数据,声明算法与类型,示例:
{ "alg": "HS256", "typ": "JWT" }Base64URL 编码后即为第一段。
Payload(负载):存放声明(Claims),
官方字段:
iss, exp, sub, aud, nbf, iat, jti。自定义字段:如
userId, name, roles等。注意:可被解码,切勿放置敏感明文。
Signature(签名):防篡改,
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)secret仅服务器持有。
9.3 手动生成示例
String headerJson = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}";
String payloadJson = new ObjectMapper().writeValueAsString(claimsMap);
String headerEnc = base64UrlEncode(headerJson);
String payloadEnc = base64UrlEncode(payloadJson);
String signature = HMACSHA256(headerEnc + "." + payloadEnc, secret);
String jwt = headerEnc + "." + payloadEnc + "." + signature;实际开发可使用开源库:
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.5.0</version>
</dependency>
9.4 工具类示例(Auth0 Java JWT)
public class JwtUtil {
private static final String SECRET = "your-secret";
public static String createToken(Map<String,Object> claims) {
return JWT.create()
.withHeader(Map.of("alg","HS256","typ","JWT"))
.withPayload(claims)
.sign(Algorithm.HMAC256(SECRET));
}
public static DecodedJWT verifyToken(String token) {
return JWT.require(Algorithm.HMAC256(SECRET))
.build()
.verify(token);
}
}9.5 JWT 在前后端分离中的应用
登录生成:
AuthenticationSuccessHandler中创建 JWT 并写入 Redis,返回给前端。前端存储:
sessionStorage(会话)或localStorage(持久)。请求携带:每次 AJAX 请求将 JWT 放入请求头,如
Authorization: Bearer <token>。后台验证:自定义
JwtFilter:跳过登录接口。
验证签名、解析负载、对比 Redis 中缓存。
成功后将
Authentication注入SecurityContext。
9.6 过期与失效策略
设置过期:JWT 自带
exp,并在 Redis 中设置 TTL。服务重启:可监听
ContextClosedEvent清空 Redis 缓存。主动退出:
LogoutSuccessHandler中删除 Redis 中对应 Token。
9.7 完整流程
前端调用
/user/login,提交用户名/密码。Spring Security 验证通过后,生成 JWT 存入 Redis 并返回。
前端存储 JWT,并在后续请求头中携带。
JwtFilter验证 JWT 有效性并加载认证信息。无需 Session,接口返回 JSON 数据。
- 微信
- 赶快加我聊天吧

- 赶快加我聊天吧
