Java中JWT无状态认证核心是token自包含信息+服务端校验签名时效,流程为登录发token→请求带token→拦截解析→置入SecurityContext→自动鉴权;需用JJWT库、封装JwtUtil、集成Spring Security并关闭session。

Java 中配置 JWT 实现无状态 REST 接口认证,核心是“不存 session、不查库验身份”,靠 token 自身携带信息 + 服务端校验签名和时效。关键不在配置多复杂,而在流程闭环:登录发 token → 请求带 token → 拦截解析 → 放入安全上下文 → 后续鉴权自动生效。
引入 JWT 支持库
用 JJWT 是最主流选择,Spring Boot 项目在 pom.xml 中添加:
io.jsonwebtoken:jjwt-api:0.12.5io.jsonwebtoken:jjwt-impl:0.12.5-
io.jsonwebtoken:jjwt-jackson:0.12.5(如需 JSON 序列化支持)
注意:JJWT 0.12+ 要求 Java 11+,且不再内置加密算法依赖,需显式引入 jjwt-impl;密钥推荐使用 HS256 或更安全的 RS256(需配公私钥对)。
定义 Token 工具类封装生成与解析
避免在 Controller 或 Filter 中硬写 JWT 构建逻辑。建议封装一个 JwtUtil 类,统一管理:
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 生成 token:设置 subject(用户 ID)、自定义 claims(如 role、tenantId)、过期时间(
exp)、签发时间(iat),用 secret 或私钥签名 - 解析 token:用相同密钥或公钥验证 signature,检查
exp是否过期,提取 payload 中的用户标识和权限字段 - 提供
isTokenExpired(String token)和getUsernameFromToken(String token)等便捷方法
示例中 secret 建议从配置文件读取(如 application.yml 的 jwt.secret: ${JWT_SECRET:change-me}),禁止硬编码。
集成 Spring Security 实现无状态拦截
替换默认的 session 认证为 token 认证,主要做三件事:
- 关闭 session 创建:
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) - 自定义
OncePerRequestFilter(如JwtAuthenticationFilter),从请求头Authorization: Bearer xxx提取 token,调用JwtUtil解析并构建UsernamePasswordAuthenticationToken - 将该 token 设置进
SecurityContextHolder.getContext().setAuthentication(...),后续@PreAuthorize或hasRole()才能起作用
记得把该 Filter 加到 UsernamePasswordAuthenticationFilter 之前,确保每次请求都先完成认证上下文填充。
登录接口返回 token 并规范响应格式
登录成功后不设 cookie,而是返回标准 JSON:
- 状态码 200 OK
- Body 包含
{"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."} - 可选返回
expiresIn(单位秒)方便前端刷新逻辑
前端拿到后存在 localStorage 或 sessionStorage,后续所有请求在 header 中带上 Authorization: Bearer {token} 即可。后端不再维护任何登录态数据,真正实现无状态。

















