SpringBoot + JWT 打造无状态登录系统,让你的应用更安全高效

360影视 欧美动漫 2025-04-27 23:42 3

摘要:还在为Session共享烦恼?每次集群部署都要头疼用户状态同步?传统Cookie+Session模式在分布式场景下越来越力不从心?本文将手把手带你用SpringBoot+JWT实现无状态登录,轻松解决分布式认证难题,代码可直接移植到你的项目!

还在为Session共享烦恼?每次集群部署都要头疼用户状态同步?传统Cookie+Session模式在分布式场景下越来越力不从心?本文将手把手带你用SpringBoot+JWT实现无状态登录,轻松解决分布式认证难题,代码可直接移植到你的项目!

服务端存储压力大,用户量激增时内存崩溃集群环境下需要Session共享,增加架构复杂度CSRF攻击风险高,安全性难以保障

JWT优势

无状态:Token自包含用户信息,服务端无需存储跨域支持:轻松解决分布式系统认证安全性强:数字签名防篡改,可选择加密算法

Token组成

Header(算法类型) Payload(携带数据)Signature(签名哈希)

工作流程

用户登录成功后生成JWT客户端存储Token(LocalStorage/Header)每次请求携带Token进行身份验证 io.jsonwebtoken jjwt 0.9.1

java

public class JwtUtils { private static final String SECRET_KEY = "your-256-bit-secret"; // 实际项目从配置读取 private static final long EXPIRATION = 86400000; // 24小时 // 生成Token public static String generateToken(String username) { return Jwts.builder .setSubject(username) .setExpiration(new Date(System.currentTimeMillis + EXPIRATION)) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact; } // 解析验证Token public static Claims parseToken(String token) { return Jwts.parser .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody; }}

java

public class JwtInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String token = request.getHeader("Authorization"); try { Claims claims = JwtUtils.parseToken(token); request.setAttribute("username", claims.getSubject); return true; } catch (Exception e) { response.setStatus(HttpStatus.UNAUTHORIZED.value); return false; } }}

java

@Configurationpublic class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new JwtInterceptor) .addPathPatterns("/api/**") .excludePathPatterns("/api/login"); }}

java

@RestController@RequestMapping("/api")public class AuthController { @PostMapping("/login") public ResponseEntity login(@RequestBody LoginRequest request) { // 1. 验证用户名密码(示例代码,实际需查数据库) if(!"admin".equals(request.getUsername) || !"123456".equals(request.getPassword)){ return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build; } // 2. 生成Token String token = JwtUtils.generateToken(request.getUsername); return ResponseEntity.ok.header("Authorization", token).build; }}

登录请求

bash

POST /api/loginBody: {"username":"admin","password":"123456"}Response Header中获取Authorization

访问受保护接口

bash

通过本文,你已经掌握了SpringBoot整合JWT的核心方法!无状态认证不仅能提升系统性能,更为微服务架构打下坚实基础。如果对你有帮助,欢迎:

来源:大龄程序猿小武

相关推荐