SpringBoot 整合 JWT——Token 认证与自动刷新
Session 方式在分布式环境下不好用JWTJSON Web Token是目前主流的无状态认证方案。服务端不需要存 SessionToken 中包含了用户信息。一、JWT 结构header.payload.signature header: 加密算法 payload: 用户数据不要放密码 signature: 签名防止篡改二、JWT 工具类ComponentpublicclassJwtUtil{Value(${jwt.secret:mySecretKey})privateStringsecret;Value(${jwt.expire:86400000})privatelongexpire;// 默认24小时publicStringgenerateToken(LonguserId,Stringusername){DatenownewDate();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;}}}三、登录接口RestControllerRequestMapping(/auth)publicclassAuthController{AutowiredprivateJwtUtiljwtUtil;PostMapping(/login)publicResultVOMapString,Objectlogin(RequestParamStringusername,RequestParamStringpassword){// 校验用户名密码if(!admin.equals(username)||!123456.equals(password)){returnResultVO.error(401,用户名或密码错误);}// 生成 TokenStringaccessTokenjwtUtil.generateToken(1001L,username);StringrefreshTokenjwtUtil.generateRefreshToken(1001L);MapString,ObjectresultnewHashMap();result.put(accessToken,accessToken);result.put(refreshToken,refreshToken);result.put(expiresIn,86400);returnResultVO.success(result);}}四、Token 刷新PostMapping(/refresh)publicResultVOMapString,Objectrefresh(RequestParamStringrefreshToken){if(!jwtUtil.validateToken(refreshToken)){returnResultVO.error(401,RefreshToken 无效);}ClaimsclaimsjwtUtil.parseToken(refreshToken);LonguserIdLong.parseLong(claims.getSubject());Stringusernameclaims.get(username,String.class);StringnewAccessTokenjwtUtil.generateToken(userId,username);StringnewRefreshTokenjwtUtil.generateRefreshToken(userId);returnResultVO.success(Map.of(accessToken,newAccessToken,refreshToken,newRefreshToken));}五、拦截器校验ComponentpublicclassJwtInterceptorimplementsHandlerInterceptor{AutowiredprivateJwtUtiljwtUtil;OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{Stringtokenrequest.getHeader(Authorization);if(tokennull||!token.startsWith(Bearer )){thrownewBusinessException(401,未登录);}tokentoken.substring(7);if(!jwtUtil.validateToken(token)){thrownewBusinessException(401,Token 已过期);}// 将用户信息存入请求上下文ClaimsclaimsjwtUtil.parseToken(token);request.setAttribute(userId,claims.getSubject());request.setAttribute(username,claims.get(username));returntrue;}}六、前端调用// 登录constrespawaitfetch(/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(){constrespawaitfetch(/auth/refresh,{method:POST,body:newURLSearchParams({refreshToken})});constdataawaitresp.json();accessTokendata.accessToken;}七、安全注意事项// 1. JWT 中不要放敏感信息ClaimsclaimsJwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();Stringpasswordclaims.get(password);// ❌ 错误// 2. 密钥不要写死用配置中心或环境变量Value(${jwt.secret})privateStringsecret;// 3. accessToken 有效期短15-30分钟// refreshToken 有效期长7天专门用来刷新 accessToken总结Session 认证服务端存 Session分布式下需要共享 Session JWT 认证 无状态Token 携带用户信息适合分布式 JWT 缺点签发后无法主动失效只能等过期 解决方案accessToken 短时效 refreshToken 刷新机制 觉得有用的话点赞 关注【张老师技术栈】吧每周更新 Java/Python/爬虫 实战干货不让你白来。

相关新闻

SpringBoot 整合 Nacos 配置中心——配置集中管理

SpringBoot 整合 Nacos 配置中心——配置集中管理

当服务数量增多时,修改一个配置要在每个服务上改一遍,非常麻烦。Nacos 配置中心可以把所有配置集中管理,修改后实时生效,无需重启。 一、部署 Nacos docker run -d \--name nacos \-p 8848:8848 \-e MODEstandalone \nacos/nacos-…

2026/10/28 17:43:18 阅读更多 →
算法面试——二叉树遍历:递归、非递归、重建二叉树

算法面试——二叉树遍历:递归、非递归、重建二叉树

二叉树遍历是算法面试的绝对基础。递归写法要熟练,非递归写法要能手撕。 一、前序遍历 void preorder(TreeNode root) {if (root null) return;System.out.print(root.val " ");preorder(root.left);preorder(root.right); }void preorderIter(TreeNode…

2026/11/9 0:08:06 阅读更多 →
HarmonyOs应用《重要日》开发第25篇 - 像素风格 UI 设计在鸿蒙中的实践

HarmonyOs应用《重要日》开发第25篇 - 像素风格 UI 设计在鸿蒙中的实践

本文从 UI 设计的角度分析 ImportantDays 项目的视觉设计语言,包括色彩体系、排版规范、卡片设计、阴影与圆角、图标使用、空状态设计,以及如何在 ArkUI 声明式 UI 中实现一致的设计风格。一、设计语言概述 ImportantDays 采用简约现代的 UI 设计风格&am…

2026/11/8 22:42:31 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/12 5:00:00 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/12 5:13:20 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/12 5:13:20 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/12 18:22:26 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/12 5:13:20 阅读更多 →

日新闻

周新闻

月新闻