当前位置: 首页 > news >正文

SpringBoot 整合 JWT——Token 认证与自动刷新

Session 方式在分布式环境下不好用,JWT(JSON Web Token)是目前主流的无状态认证方案。服务端不需要存 Session,Token 中包含了用户信息。

一、JWT 结构

header.payload.signature header: 加密算法 payload: 用户数据(不要放密码) signature: 签名,防止篡改

二、JWT 工具类

@ComponentpublicclassJwtUtil{@Value("${jwt.secret:mySecretKey}")privateStringsecret;@Value("${jwt.expire:86400000}")privatelongexpire;// 默认24小时publicStringgenerateToken(LonguserId,Stringusername){Datenow=newDate();returnJwts.builder().setSubject(userId.toString()).claim("username",username).setIssuedAt(now).setExpiration(newDate(now.getTime()+expire)).signWith(SignatureAlgorithm.HS256,secret).compact();}publicClaimsparseToken(Stringtoken){returnJwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();}publicbooleanvalidateToken(Stringtoken){try{parseToken(token);returntrue;}catch(Exceptione){returnfalse;}}}

三、登录接口

@RestController@RequestMapping("/auth")publicclassAuthController{@AutowiredprivateJwtUtiljwtUtil;@PostMapping("/login")publicResultVO<Map<String,Object>>login(@RequestParamStringusername,@RequestParamStringpassword){// 校验用户名密码if(!"admin".equals(username)||!"123456".equals(password)){returnResultVO.error(401,"用户名或密码错误");}// 生成 TokenStringaccessToken=jwtUtil.generateToken(1001L,username);StringrefreshToken=jwtUtil.generateRefreshToken(1001L);Map<String,Object>result=newHashMap<>();result.put("accessToken",accessToken);result.put("refreshToken",refreshToken);result.put("expiresIn",86400);returnResultVO.success(result);}}

四、Token 刷新

@PostMapping("/refresh")publicResultVO<Map<String,Object>>refresh(@RequestParamStringrefreshToken){if(!jwtUtil.validateToken(refreshToken)){returnResultVO.error(401,"RefreshToken 无效");}Claimsclaims=jwtUtil.parseToken(refreshToken);LonguserId=Long.parseLong(claims.getSubject());Stringusername=claims.get("username",String.class);StringnewAccessToken=jwtUtil.generateToken(userId,username);StringnewRefreshToken=jwtUtil.generateRefreshToken(userId);returnResultVO.success(Map.of("accessToken",newAccessToken,"refreshToken",newRefreshToken));}

五、拦截器校验

@ComponentpublicclassJwtInterceptorimplementsHandlerInterceptor{@AutowiredprivateJwtUtiljwtUtil;@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{Stringtoken=request.getHeader("Authorization");if(token==null||!token.startsWith("Bearer ")){thrownewBusinessException(401,"未登录");}token=token.substring(7);if(!jwtUtil.validateToken(token)){thrownewBusinessException(401,"Token 已过期");}// 将用户信息存入请求上下文Claimsclaims=jwtUtil.parseToken(token);request.setAttribute("userId",claims.getSubject());request.setAttribute("username",claims.get("username"));returntrue;}}

六、前端调用

// 登录constresp=awaitfetch('/auth/login',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({username:'admin',password:'123456'})});const{accessToken,refreshToken}=awaitresp.json();// 后续请求携带 Tokenfetch('/api/user',{headers:{'Authorization':'Bearer '+accessToken}});// Token 过期时用 refreshToken 刷新asyncfunctionrefreshAccessToken(){constresp=awaitfetch('/auth/refresh',{method:'POST',body:newURLSearchParams({refreshToken})});constdata=awaitresp.json();accessToken=data.accessToken;}

七、安全注意事项

// 1. JWT 中不要放敏感信息Claimsclaims=Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();Stringpassword=claims.get("password");// ❌ 错误!// 2. 密钥不要写死,用配置中心或环境变量@Value("${jwt.secret}")privateStringsecret;// 3. accessToken 有效期短(15-30分钟)// refreshToken 有效期长(7天),专门用来刷新 accessToken

总结

Session 认证:服务端存 Session,分布式下需要共享 Session JWT 认证: 无状态,Token 携带用户信息,适合分布式 JWT 缺点:签发后无法主动失效(只能等过期) 解决方案:accessToken 短时效 + refreshToken 刷新机制

💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!每周更新 Java/Python/爬虫 实战干货,不让你白来。

http://www.jsqmd.com/news/1216560/

相关文章:

  • 2026宁波本地工业气体服务商选购维度评测汇总 - 奔跑123
  • FTP 服务器挂载成本地磁盘盘符
  • 2026惠州GEO搜索优化正规服务机构实力排行汇总 - 奔跑123
  • Linux Shell编程实战:需求驱动与自动化测试
  • AM62L硬件防火墙配置实战:从寄存器解析到嵌入式系统安全设计
  • JS三种引入方式详解|行内JS、内部JS、外部JS 优缺点全面对比
  • 亲身到店探访合肥亨得利官方名表服务中心|全新维修地址和售后服务电话(2026年7月更新) - 亨得利官方
  • puzzle(1022)数图、彩色数图、字母沙拉
  • AI 电动窗帘电机智能功率 MOSFET 覆盖电机驱动、电源管理、控制逻辑的完整选型方案
  • 2026武汉网站建设公司哪家好 行业口碑排行盘点 - 奔跑123
  • 天梭中国官方售后服务中心|服务热线及全部维修详细地址权威信息声明(2026年7月更新) - 天梭服务中心
  • Python 数据清洗实战——缺失值、异常值、重复值处理
  • Rust AI 工具发布为单二进制:静态链接把一切装进一个文件的技术要点
  • 2026西安全日制综合职业高中最新排行榜单梳理 - 奔跑123
  • 2026行业交流场景下浙江塑料切粒机厂家哪家好解读 - 奔跑123
  • 2024年SAP实用网站资源大全与开发指南
  • 嵌入式GPMC配置实战:地址解码、WAIT引脚与总线时序优化
  • AI 辅助前端性能瓶颈定位:从 Lighthouse 报告到代码级根因分析
  • 亨得利钟表服务中心维修地址与24小时热线实地考察报告+多信源验证(2026年七月最新) - 亨得利官方博客
  • 鸿蒙 ArkTS 实战:Knowledge Card Generator 从智能助手到保存闭环完整解析
  • AI周报(2026年7月第3周):WAIC产业发布、Kimi K3开源、AI工具供应链警钟
  • 2026年7月最新长沙建材市场热门石膏板十大品牌榜单完整解读 - 奔跑123
  • 数据结构——KMP 字符串匹配算法:next 数组计算与优化
  • 2026武汉网站建设公司综合实力排行情况完整梳理 - 奔跑123
  • 2026年7月最新宝珀北京长安商场维修保养服务电话 - 宝珀官方售后服务中心
  • 2026年7月佛山靠谱AI搜索优化公司排行完整名单盘点 - 奔跑123
  • 需求驱动的Shell脚本开发实践与优化
  • 人教B版:第十一章 立体几何初步总结
  • PyTorch 深度学习专题【左扬精讲】—— 目标检测与语义分割:CNN 的下游任务应用
  • 智能开发环境架构:AI 增强的本地开发体验设计