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/2 16:05:38 阅读更多 →
算法面试——二叉树遍历:递归、非递归、重建二叉树

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

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

2026/10/17 18:30:55 阅读更多 →
HarmonyOs应用《重要日》开发第25篇 - 像素风格 UI 设计在鸿蒙中的实践

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

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

2026/10/16 14:27:51 阅读更多 →

最新新闻

SteamOS 安装到 AMD 新显卡:RX 9060 XT 性能发挥实战指南

SteamOS 安装到 AMD 新显卡:RX 9060 XT 性能发挥实战指南

最近不少朋友在讨论 SteamOS 装到普通 PC 上的玩法,尤其是搭配 AMD 新卡的组合。有位朋友跟我说,他在一台整机配置并不算高的机器上装好 SteamOS,显卡是 RX 9060 XT,进游戏后的流畅度比想象中要好很多。这里说的“低配”&#xff…

2026/10/18 2:06:55 阅读更多 →
Oracle 11.2.0.1 补丁安装四道生死门与三重验证法

Oracle 11.2.0.1 补丁安装四道生死门与三重验证法

简介:本资源是一份面向Oracle数据库运维工程师与DBA的实战型补丁管理指南,聚焦Oracle 11.2.0.1版本的补丁安装全流程,解决企业环境中常见补丁部署不规范、回滚困难、验证缺失等痛点。文档以清晰步骤覆盖安装前环境检查与全量备份、OPatch工具…

2026/10/18 2:06:55 阅读更多 →
CAD2024安装教程源码:静默安装与彻底卸载脚本实践

CAD2024安装教程源码:静默安装与彻底卸载脚本实践

简介:这份资源面向零基础到进阶的机械设计学习者与工程师,提供CAD2024机械版的下载与安装指引,帮助用户在自己的电脑上顺利部署并运行这款专业计算机辅助设计工具。压缩包共3个文件,以inscode项目配置、html页面和gitignore忽略规…

2026/10/18 2:06:55 阅读更多 →
GrADS气象绘图入门:安装、ctl数据描述与脚本批量出图

GrADS气象绘图入门:安装、ctl数据描述与脚本批量出图

简介:这份资源是面向气象、环境及科研数据分析初学者的GrADS绘图软件入门文档,帮助零基础用户完成软件安装并掌握基本绘图命令。GrADS作为自由软件,支持Windows与Unix平台,可处理经纬度、层次、时间构成的4D格点或离散数据&#x…

2026/10/18 2:06:55 阅读更多 →
加速度传感器能测哪些物理量?从原理到工程选型实测指南

加速度传感器能测哪些物理量?从原理到工程选型实测指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 2:06:55 阅读更多 →
FPGA研发工程师核心技能与学习路径全解析

FPGA研发工程师核心技能与学习路径全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 2:05:55 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →