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

SpringBoot 集成 JWT 实现登录认证 + 权限拦截(电商系统实战,代码可直接复制)

一、开篇引言做前后端分离的电商管理系统登录认证与权限控制是绝对的核心功能也是 Java 后端面试的高频考点。你是不是也遇到过这些问题前后端分离项目Session 共享困难无法用传统 Session 做登录认证不知道如何实现无状态的用户登录接口安全无法保障分不清 JWT 的原理、结构踩坑后无法排查问题不知道如何结合 SpringBoot 实现登录拦截、权限校验防止未授权访问本文结合你正在做的电商管理系统从原理到实战完整实现 SpringBoot 集成 JWT 实现登录认证 全局权限拦截包含完整可复制代码、高频踩坑总结15 分钟就能搭建企业级登录认证体系完美适配你的项目。本文基于 SpringBoot 2.7.x JWT 0.11.5适合 Java 后端初学者、正在做前后端分离项目的同学尤其适合大二计算机专业学生练手电商项目。二、核心知识点先懂原理再写代码1. JWT 核心原理JWTJSON Web Token是一种无状态的身份认证方案核心是将用户身份信息加密后生成 Token前端存储 Token每次请求携带 Token 到后端后端解密验证身份无需在服务端存储 Session完美适配前后端分离项目。2. JWT 结构拆解JWT 由 3 部分组成用 . 分隔Header头部存储签名算法如 HS256、Token 类型Payload载荷存储用户信息如用户 ID、用户名、过期时间等自定义声明Signature签名用密钥对 HeaderPayload 加密生成防止 Token 被篡改3. 核心优势无状态服务端无需存储 Session扩展性强适合分布式系统跨域友好完美适配前后端分离、移动端等场景安全性高签名机制防止 Token 被篡改可设置过期时间保障安全三、环境准备直接复制无需修改!--SpringBootWeb核心依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--JWT核心依赖0.11.5稳定版--dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-api/artifactIdversion0.11.5/version/dependencydependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-impl/artifactIdversion0.11.5/versionscoperuntime/scope/dependencydependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-jackson/artifactIdversion0.11.5/versionscoperuntime/scope/dependency!--MyBatis-Plus复用电商系统已有依赖--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.3/version/dependency!--Lombok简化代码--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency2. application.yml 配置#JWT配置 jwt:# 密钥生产环境请更换为复杂密钥建议16位以上 secret:my-secret-key-1234567890# 过期时间单位毫秒7天7*24*60*60*1000604800000 expiration:604800000#Token前缀 token-prefix:Bearer# 请求头名称 header:Authorization四、核心代码实现严格拆分「工具类 拦截器 接口」4.1 JWT 工具类核心生成 / 解析 Tokenpackagecom.example.demo.utils;importio.jsonwebtoken.Claims;importio.jsonwebtoken.Jwts;importio.jsonwebtoken.SignatureAlgorithm;importio.jsonwebtoken.security.Keys;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Component;importjavax.crypto.SecretKey;importjava.nio.charset.StandardCharsets;importjava.util.Date;importjava.util.HashMap;importjava.util.Map;/** * JWT 工具类 * 用于生成 Token、解析 Token、验证 Token 有效性 */ComponentpublicclassJwtUtils{Value(${jwt.secret})privateStringsecret;Value(${jwt.expiration})privateLongexpiration;Value(${jwt.token-prefix})privateStringtokenPrefix;/** * 生成密钥 */privateSecretKeygetSignKey(){returnKeys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));}/** * 生成 Token * param userId 用户ID * param username 用户名 * return 生成的 Token */publicStringgenerateToken(LonguserId,Stringusername){MapString,ObjectclaimsnewHashMap();claims.put(userId,userId);claims.put(username,username);returncreateToken(claims,username);}/** * 创建 Token */privateStringcreateToken(MapString,Objectclaims,Stringsubject){DatenownewDate();DateexpireDatenewDate(now.getTime()expiration);returnJwts.builder().setClaims(claims)// 自定义载荷.setSubject(subject)// 主题.setIssuedAt(now)// 签发时间.setExpiration(expireDate)// 过期时间.signWith(getSignKey(),SignatureAlgorithm.HS256)// 签名.compact();}/** * 解析 Token获取载荷 */publicClaimsparseToken(Stringtoken){returnJwts.parserBuilder().setSigningKey(getSignKey()).build().parseClaimsJws(token).getBody();}/** * 从 Token 中获取用户ID */publicLonggetUserIdFromToken(Stringtoken){ClaimsclaimsparseToken(token);returnLong.valueOf(claims.get(userId).toString());}/** * 验证 Token 是否过期 */publicBooleanisTokenExpired(Stringtoken){ClaimsclaimsparseToken(token);returnclaims.getExpiration().before(newDate());}/** * 验证 Token 有效性 */publicBooleanvalidateToken(Stringtoken){try{return!isTokenExpired(token);}catch(Exceptione){returnfalse;}}/** * 去除 Token 前缀 */publicStringremovePrefix(Stringtoken){if(token.startsWith(tokenPrefix)){returntoken.substring(tokenPrefix.length()).trim();}returntoken;}}4.2 JWT 拦截器全局权限拦截验证 Tokenpackagecom.example.demo.interceptor;importcom.example.demo.utils.JwtUtils;importorg.springframework.stereotype.Component;importorg.springframework.web.servlet.HandlerInterceptor;importjavax.annotation.Resource;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/** * JWT 拦截器 * 拦截所有请求验证 Token 有效性实现登录认证 */ComponentpublicclassJwtInterceptorimplementsHandlerInterceptor{ResourceprivateJwtUtilsjwtUtils;OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{// 1. 处理跨域预检请求OPTIONS 直接放行if(OPTIONS.equals(request.getMethod())){returntrue;}// 2. 从请求头获取 TokenStringtokenrequest.getHeader(Authorization);// 3. Token 为空返回未授权if(tokennull||token.isEmpty()){response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.getWriter().write({\code\:401,\msg\:\未登录请先登录\});returnfalse;}// 4. 去除 Token 前缀tokenjwtUtils.removePrefix(token);// 5. 验证 Token 有效性if(!jwtUtils.validateToken(token)){response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.getWriter().write({\code\:401,\msg\:\Token 已过期请重新登录\});returnfalse;}// 6. Token 有效放行请求returntrue;}}4.3 拦截器配置类注册拦截器配置放行路径packagecom.example.demo.config;importcom.example.demo.interceptor.JwtInterceptor;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;importjavax.annotation.Resource;/** * WebMvc 配置类 * 注册 JWT 拦截器配置拦截/放行路径 */ConfigurationpublicclassWebMvcConfigimplementsWebMvcConfigurer{ResourceprivateJwtInterceptorjwtInterceptor;OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(jwtInterceptor)// 拦截所有请求.addPathPatterns(/**)// 放行登录、注册等接口电商系统核心放行路径.excludePathPatterns(/user/login,// 登录接口/user/register,// 注册接口/captcha/get,// 验证码接口/doc.html,// Knife4j 接口文档/webjars/**,/v3/api-docs/**);}}4.4 登录接口实现电商系统用户登录packagecom.example.demo.controller;importcom.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;importcom.example.demo.common.Result;importcom.example.demo.entity.User;importcom.example.demo.service.UserService;importcom.example.demo.utils.JwtUtils;importorg.springframework.util.DigestUtils;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjavax.annotation.Resource;importjava.util.HashMap;importjava.util.Map;/** * 用户登录控制器 * 实现电商系统用户登录生成 JWT Token */RestControllerRequestMapping(/user)publicclassLoginController{ResourceprivateUserServiceuserService;ResourceprivateJwtUtilsjwtUtils;/** * 用户登录接口 * param user 登录信息username、password * return 登录结果 Token */PostMapping(/login)publicResultMapString,Objectlogin(RequestBodyUseruser){// 1. 校验用户名密码非空if(user.getUsername()null||user.getPassword()null){returnResult.fail(用户名或密码不能为空);}// 2. 根据用户名查询用户LambdaQueryWrapperUserwrappernewLambdaQueryWrapper();wrapper.eq(User::getUsername,user.getUsername()).eq(User::getDeleted,0);UserexistUseruserService.getOne(wrapper);// 3. 用户不存在if(existUsernull){returnResult.fail(用户名不存在);}// 4. 密码校验实际项目用 BCrypt 加密此处用 MD5 演示StringinputPwdDigestUtils.md5DigestAsHex(user.getPassword().getBytes());if(!inputPwd.equals(existUser.getPassword())){returnResult.fail(密码错误);}// 5. 生成 JWT TokenStringtokenjwtUtils.generateToken(existUser.getId(),existUser.getUsername());// 6. 返回登录结果MapString,ObjectresultnewHashMap();result.put(token,token);result.put(user,existUser);returnResult.success(result);}}五、接口测试效果演示1. 登录请求请求POST /user/login请求体{username:zhangsan,password:123456}返回{code:200,msg:操作成功,data:{token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...,user:{id:1,username:zhangsan,nickname:张三,status:1}}}2. 带 Token 请求用户接口请求头Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…请求GET /user/1返回{code:200,msg:操作成功,data:{id:1,username:zhangsan,nickname:张三}}3. 无 Token / 过期 Token 请求返回{code:401,msg:未登录请先登录}六、高频踩坑总结新手必看坑 1跨域预检请求OPTIONS被拦截原因拦截器没有放行 OPTIONS 请求导致跨域失败解决方案在拦截器中添加 if (“OPTIONS”.equals(request.getMethod())) { return true; }直接放行预检请求坑 2Token 过期时间设置不合理原因过期时间太短用户频繁登录太长安全性低解决方案电商系统建议设置 7 天过期同时实现 Token 刷新机制后续可扩展坑 3密钥泄露Token 被篡改原因密钥过于简单生产环境硬编码在代码中解决方案密钥设置为 16 位以上复杂字符串生产环境通过配置中心管理禁止硬编码坑 4载荷存储敏感信息原因JWT 载荷是 Base64 编码可直接解码不能存储密码等敏感信息解决方案载荷仅存储用户 ID、用户名等非敏感信息敏感信息绝对不能存入坑 5拦截器放行路径配置错误原因登录、验证码等接口被拦截导致无法登录解决方案严格配置放行路径确保登录、注册、验证码等接口不受拦截七、总结与延伸本文完整实现了 SpringBoot 集成 JWT 实现登录认证 全局权限拦截完美适配电商管理系统的登录需求所有代码可直接复制到你的项目中使用。通过本文的实现你可以彻底解决前后端分离项目的登录认证问题实现无状态身份校验掌握 JWT 的核心原理与实战用法应对面试高频考点搭建企业级登录认证体系保障接口安全为后续权限控制RBAC、角色管理打下基础本文是电商管理系统实战系列的第 4 篇上一篇讲解了 MyBatis-Plus 条件查询避坑下一篇将讲解 SpringBoot 集成 Redis 实现缓存优化感兴趣的同学可以关注我持续更新 Java 后端实战内容。八、互动引导你在集成 JWT 时还遇到过哪些问题欢迎在评论区留言我会逐一解答觉得有用的同学点赞 收藏不迷路后续更新更多 Java 后端学习、项目实战、面试技巧关注我持续分享 Java 后端干货陪你从大二到秋招拿 offer

相关文章:

SpringBoot 集成 JWT 实现登录认证 + 权限拦截(电商系统实战,代码可直接复制)

一、开篇引言 做前后端分离的电商管理系统,登录认证与权限控制是绝对的核心功能,也是 Java 后端面试的高频考点。你是不是也遇到过这些问题: 前后端分离项目,Session 共享困难,无法用传统 Session 做登录认证 不知道如…...

ELi_MdM_4_00电机驱动库:工业嵌入式多模式PWM控制框架

1. ELi_MdM_4_00 电机驱动库深度解析:面向工业级嵌入式控制的多模式驱动框架ELi_MdM_4_00 是 E-LAGORi 公司推出的第四代电机驱动模块专用固件库,专为嵌入式系统对多类型执行机构的精确、可靠、低开销控制而设计。该库并非通用型电机控制抽象层&#xff…...

三、RA8D1 CoreMark测试GCC vs AC6和分散加载浅析

一、概述RA8D1 搭载 Cortex-M85 内核,主频 480MHz使用 GCC(13.3.1) 和 AC6(Clang 20.0.0git) 两种工具链编译 CoreMark测试不同优化等级、内存布局(CacheSRAM、TCM)对跑分的影响二、测试环境项目参数芯片RA8D1内核Cortex-M85主频480MHzGCC 版…...

KART-RERANK模型解析:互联网时代信息过载的智能过滤利器

KART-RERANK模型解析:互联网时代信息过载的智能过滤利器 每天一睁眼,手机里就塞满了未读消息:几十条群聊、上百条朋友圈、几十个App推送,还有永远刷不完的新闻和短视频。想找昨天朋友分享的那篇有趣的文章?得在信息洪…...

golang如何实现知识库问答系统_golang知识库问答系统实现实践

最省事的是 Qdrant 或 Milvus——二者均有官方 Go SDK,支持 HTTP/gRPC,文档完备;Qdrant 适合中小规模,Milvus 适合横向扩展,但需锁死 SDK 版本至 v2.4.5。用什么向量数据库搭配 Go 最省事Go 原生不带向量检索能力&…...

终极 .NET 逆向工程指南:dnSpyEx 深度调试与程序集编辑完全攻略

终极 .NET 逆向工程指南:dnSpyEx 深度调试与程序集编辑完全攻略 【免费下载链接】dnSpy Unofficial revival of the well known .NET debugger and assembly editor, dnSpy 项目地址: https://gitcode.com/gh_mirrors/dns/dnSpy dnSpyEx 作为 .NET 调试与逆向…...

如何实现SQL复杂计算触发器原子性_利用触发器事务控制

是,触发器天然包含在主SQL事务中;其数据修改随主语句回滚,无需手动开启事务,但不可修改被主语句操作的同一张表。触发器里写复杂SQL计算,事务会自动包含吗会。只要触发器在支持事务的存储引擎(比如 InnoDB&…...

Audio Pixel Studio效果展示:1000字长文TTS生成耗时与内存占用实测

Audio Pixel Studio效果展示:1000字长文TTS生成耗时与内存占用实测 1. 语音合成效果实测 Audio Pixel Studio集成了Microsoft Edge TTS引擎,支持多国语言和多种高保真音色。本次测试将重点展示其在长文本合成时的性能表现。 1.1 测试环境配置 测试使…...

CLIP ViT-H-14惊艳效果:建筑图纸与实景照片在特征空间的跨域对齐

CLIP ViT-H-14惊艳效果:建筑图纸与实景照片在特征空间的跨域对齐 1. 项目概述 今天我们要介绍的是基于CLIP ViT-H-14模型的图像特征提取服务。这个服务能够将各种类型的图像转换为1280维的特征向量,特别擅长处理建筑图纸与实景照片之间的跨域对齐问题。…...

数据结构笔记2

一、红黑树(Red-Black Tree)1. 背景平衡二叉树(AVL)虽能保证查询复杂度稳定在O(logN),但旋转调整过于复杂,性能消耗较大;红黑树作为折中方案,兼顾稳定性和维护成本,是“最…...

创新高效的跨平台Steam创意工坊下载解决方案:WorkshopDL一站式开源工具

创新高效的跨平台Steam创意工坊下载解决方案:WorkshopDL一站式开源工具 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为Epic Games Store或GOG平台上的游戏无…...

告别熬夜守候:DouyinLiveRecorder让40+平台直播录制全自动

告别熬夜守候:DouyinLiveRecorder让40平台直播录制全自动 【免费下载链接】DouyinLiveRecorder 可循环值守和多人录制的直播录制软件,支持抖音、TikTok、Youtube、快手、虎牙、斗鱼、B站、小红书、pandatv、sooplive、flextv、popkontv、twitcasting、wi…...

Dell G15散热控制系统:WMI接口的Python实现与硬件控制深度解析

Dell G15散热控制系统:WMI接口的Python实现与硬件控制深度解析 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 Thermal Control Center for Dell G…...

我为什么开始安利 Hermes Agent:它和 OpenClaw 到底有什么不一样?

如果你最近在折腾 AI Agent,大概率已经见过一堆“能聊天、能调工具、能接 Telegram/Discord”的项目了。问题不在于有没有,而在于:哪个真的值得长期用,哪个只是演示时很猛,落地时很折磨。 这两天我认真装了一遍 Herme…...

大模型跨云推理延迟骤降62%:揭秘某千亿级AI平台落地K8s+Istio+OSS联邦的5步标准化流水线

第一章:大模型工程化跨云部署最佳实践 2026奇点智能技术大会(https://ml-summit.org) 大模型跨云部署已从概念验证阶段迈入规模化生产落地关键期。面对异构云环境(如 AWS、Azure、阿里云、华为云)的网络策略、存储接口、GPU驱动栈及安全合规…...

游戏串流技术选型指南:为什么Sunshine成为开源游戏串流首选方案

游戏串流技术选型指南:为什么Sunshine成为开源游戏串流首选方案 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 在构建家庭游戏云或远程游戏串流系统时,技术…...

大模型工程化到底缺什么?——SITS2026白皮书披露行业首套成熟度评估矩阵(含自测工具)

第一章:SITS2026发布:大模型工程化白皮书下载 2026奇点智能技术大会(https://ml-summit.org) SITS2026(Scalable Intelligent Training & Serving Summit)正式发布《大模型工程化白皮书(2026版)》&am…...

为什么92%的大模型项目卡在L3?SITS2026圆桌解密工程化跃迁的3个断层与1套验证框架

第一章:SITS2026圆桌:大模型工程化的未来趋势 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026圆桌讨论中,来自Meta、阿里云、Hugging Face与CNCF模型工作组的七位工程实践者共同指出:大模型工程化正从“能跑通”迈向“…...

Docker部署Ollama模型烫

前言 Kubernetes 本身并不复杂,是我们把它搞复杂的。无论是刻意为之还是那种虽然出于好意却将优雅的原语堆砌成 鲁布戈德堡机械 的狂热。平台最初提供的 ReplicaSets、Services、ConfigMaps,这些基础组件简单直接,甚至显得有些枯燥。但后来我…...

DSMR协议嵌入式解析库:低资源流式解析与OBIS映射实现

1. DSMR协议解析库技术深度解析:面向嵌入式电表数据采集的底层实现 1.1 DSMR协议背景与工程意义 DSMR(Dutch Smart Meter Requirements)是荷兰国家电网强制推行的智能电表通信标准,其核心目标是统一家庭/工商业电表与能源供应商之…...

.NET 磁盘BitLocker加密-技术选型览

在之前的文章中,我们花了大量的篇幅,从记录后端pod真实ip开始说起,然后引入envoy,再解决了各种各样的需求:配置自动重载、流量劫持、sidecar自动注入,到envoy的各种能力:熔断、流控、分流、透明…...

战地风云2042启动失败缺少dll文件?2026最新官方安全修复指南

满怀期待地打开《战地风云2042》,结果屏幕上弹出一个窗口,告诉你“缺少xxx.dll,无法继续执行代码”。这种报错直接浇灭了游戏的热情。很多玩家第一反应是去网上搜这个dll名字,然后找个网站下载下来,这是非常危险的。这…...

Qwen2-VL-2B-Instruct跨平台调用方案:从移动端App到桌面应用的集成实践

Qwen2-VL-2B-Instruct跨平台调用方案:从移动端App到桌面应用的集成实践 1. 引言:当AI能力需要无处不在 最近在做一个项目,需要把视觉语言模型的能力塞进各种客户端里——手机App、桌面软件都得用上。一开始觉得挺简单,不就是调个…...

从“支付”到“取货”:售货机取货码方案设计与实现

一、背景与问题 🤔随着无人零售与智能售货机的普及,传统“扫码支付→立即出货”的模式,已经逐渐不够用了。毕竟,现在的玩法越来越“骚”:做个任务就能领饮料 🧃员工每天白嫖一瓶快乐水 😎发个笔…...

终极指南:使用ncmdump免费解密网易云音乐NCM文件,轻松转换MP3格式

终极指南:使用ncmdump免费解密网易云音乐NCM文件,轻松转换MP3格式 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经下载了网易云音乐的歌曲,却发现只能在特定播放器中播放?&a…...

GLM-4-9B-Chat-1M惊艳效果:1M上下文下‘反事实推理’能力边界测试

GLM-4-9B-Chat-1M惊艳效果:1M上下文下反事实推理能力边界测试 1. 引言:当AI能读完200万字,会发生什么? 想象一下,你面前摆着一套《三体》全集,大概100多万字。现在有个AI告诉你:我能一口气读完…...

CKKS 同态加密数学基础推导诺

背景 StreamJsonRpc 是微软官方维护的用于 .NET 和 TypeScript 的 JSON-RPC 通信库,以其强大的类型安全、自动代理生成和成熟的异常处理机制著称。在 HagiCode 项目中,为了通过 ACP (Agent Communication Protocol) 与外部 AI 工具(如 iflow …...

1979年11月3日晚上21-23点出生性格、运势和命运

在1979年11月3日晚上21 - 23点出生之人,其性格往往有着独特的烙印。这个时间段出生的人,性格多沉稳内敛,有着自己的思考方式和行事准则。他们通常具备较强的观察力,能敏锐地察觉到周围环境的细微变化,在与人交往中&…...

MOOTDX终极指南:免费构建你的股票量化分析系统

MOOTDX终极指南:免费构建你的股票量化分析系统 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 你是否曾因股票数据获取困难而放弃量化分析的想法?是否被高昂的数据费用吓退…...

2026年黑龙江市场,这些专业装修公司值得你深入了解!

在黑龙江装修市场,选择一家靠谱的装修公司至关重要。下面为大家深入分析几家值得关注的装修公司,其中为尚奢享凭借其独特优势在市场中脱颖而出。为尚奢享:施工与服务双优典范为尚奢享即哈尔滨为尚装饰设计有限公司,成立十年来&…...