摘要:还在为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.1java
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的核心方法!无状态认证不仅能提升系统性能,更为微服务架构打下坚实基础。如果对你有帮助,欢迎:
来源:大龄程序猿小武
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!