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

SpringBoot 拦截器(Interceptor)自定义实现登录鉴权

在 Web 项目中,登录鉴权是最核心的安全机制:
接口必须校验用户是否登录、是否拥有权限,未登录则直接拦截,禁止访问。

SpringBoot 提供的HandlerInterceptor 拦截器,是实现登录校验、日志记录、接口限流最优雅的方案。

本篇文章将介绍原理、自定义拦截器、登录校验实战、放行白名单、全局异常处理


一、什么是拦截器?作用是什么?

拦截器(Interceptor):在请求进入Controller 之前/之后/渲染完成进行拦截处理。

核心用途:

  1. 登录状态校验
  2. 权限校验
  3. 接口日志记录
  4. 防重复提交
  5. 性能监控

特点:

  • 只拦截Controller 请求

  • 不拦截静态资源(可配置)

  • 可中断请求,直接返回结果

  • 全局统一控制,代码干净


二、拦截器核心 API

实现HandlerInterceptor接口,重写 3 个方法:

1publicinterfaceHandlerInterceptor{ 2 3// 1. 请求进入Controller之前执行(鉴权写这里) 4defaultbooleanpreHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throwsException{ 5returntrue;// true=放行 false=拦截 6} 7 8// 2. Controller执行完毕,渲染页面之前执行 9defaultvoidpostHandle(...)throwsException{} 10 11// 3. 整个请求完全结束后执行(清理资源) 12defaultvoidafterCompletion(...)throwsException{} 13}

登录鉴权只需要 preHandle


三、自定义登录拦截器

创建LoginInterceptor.java

1importlombok.extern.slf4j.Slf4j; 2importorg.springframework.web.servlet.HandlerInterceptor; 3importjavax.servlet.http.HttpServletRequest; 4importjavax.servlet.http.HttpServletResponse; 5 6/** 7* 登录拦截器:校验是否登录 8*/ 9@Slf4j 10publicclassLoginInterceptorimplementsHandlerInterceptor{ 11 12// 进入Controller前执行:核心校验逻辑 13@Override 14publicbooleanpreHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throwsException{ 15 16// 1. 获取前端传递的 Token / Session 17String token = request.getHeader("token"); 18 log.info("当前请求token:{}", token); 19 20// 2. 判断是否登录(真实项目:查询Redis/数据库) 21if(token ==null|| token.isEmpty()){ 22 log.error("用户未登录,请求被拦截"); 23 24// 拦截,返回未登录提示 25 response.setContentType("application/json;charset=utf-8"); 26 response.getWriter().write("{\"code\":401,\"msg\":\"未登录,请先登录\",\"data\":null}"); 27returnfalse; 28} 29 30// 3. 登录有效,放行 31returntrue; 32} 33}

四、注册拦截器 + 配置白名单

创建WebConfig.java
实现WebMvcConfigurer,注册拦截器并设置放行接口(登录、注册、放行接口)。

1importorg.springframework.context.annotation.Configuration; 2importorg.springframework.web.servlet.config.annotation.InterceptorRegistry; 3importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer; 4 5/** 6*Web 配置:注册拦截器 7*/ 8@Configuration 9publicclassWebConfigimplementsWebMvcConfigurer{ 10 11@Override 12publicvoidaddInterceptors(InterceptorRegistry registry){ 13 registry.addInterceptor(newLoginInterceptor()) 14.addPathPatterns("/**")// 拦截所有请求 15.excludePathPatterns(// 放行白名单 16"/user/login",// 登录接口 17"/user/register",// 注册接口 18"/swagger/**",// 接口文档 19"/v3/api-docs/**" 20); 21} 22}

配置完成,所有接口都会自动校验登录


五、配合统一返回结构

拦截器中直接返回Result 格式

1response.setContentType("application/json;charset=utf-8"); 2Result result =Result.fail(401,"未登录,请先登录"); 3response.getWriter().write(newObjectMapper().writeValueAsString(result)); 4returnfalse;

返回格式:

1{ 2"code":401, 3"msg":"未登录,请先登录", 4"data":null 5}

六、登录校验逻辑

真实项目中,登录逻辑一般是:

  1. 前端登录成功,后端生成Token

  2. Token 存入Redis(设置过期时间)

  3. 前端每次请求在请求头 header 携带 token

  4. 拦截器获取 token,查询 Redis 是否有效

  5. 有效放行,无效拦截

完整版拦截器

1@Slf4j 2publicclassLoginInterceptorimplementsHandlerInterceptor{ 3 4@Autowired 5privateRedisTemplate<String,Object> redisTemplate; 6 7@Override 8publicbooleanpreHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throwsException{ 9String token = request.getHeader("token"); 10 11// 1. 无token 12if(token ==null|| token.isBlank()){ 13returnresponseFail(response,"未登录,请先登录"); 14} 15 16// 2. 校验Redis 17Object user = redisTemplate.opsForValue().get("login:token:"+ token); 18if(user ==null){ 19returnresponseFail(response,"登录已过期,请重新登录"); 20} 21 22// 3. 放行 23returntrue; 24} 25 26// 统一返回错误 27privatebooleanresponseFail(HttpServletResponse response,String msg)throwsException{ 28 response.setContentType("application/json;charset=utf-8"); 29Result<?> result =Result.fail(401, msg); 30 response.getWriter().write(newObjectMapper().writeValueAsString(result)); 31returnfalse; 32} 33}

七、拦截器常见高级用法

1. 获取当前请求接口信息

1HandlerMethod handlerMethod =(HandlerMethod) handler; 2String methodName = handlerMethod.getMethod().getName(); 3String className = handlerMethod.getBean().getClass().getName();

2. 放行静态资源

1.excludePathPatterns("/static/**","/img/**","/css/**","/js/**")

3. 多拦截器顺序

1registry.addInterceptor(A).order(1); 2registry.addInterceptor(B).order(2);

数字越小,越先执行。


八、拦截器 VS 过滤器 Filter

组件

技术

作用范围

适用场景

拦截器 Interceptor

Spring

只拦截Controller

登录、权限、日志

过滤器 Filter

Servlet

所有请求

编码、跨域、限流

登录鉴权优先用拦截器


九、总结

  1. 实现 HandlerInterceptor
  2. preHandle 写登录校验
  3. WebConfig 注册 + 白名单
  4. 返回 401 未登录
  5. 配合 Redis 实现真实登录鉴权

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

相关文章:

  • 节能模式设置:OpenClaw+GLM-4.7-Flash的夜间自动化方案
  • 基于MATLAB RVC与Simulink的ABB-IRB-1200运动学建模及轨迹规划实战
  • 终极指南:color库的自动化测试与部署持续集成流程
  • ZGC 2.0启用后反而更慢?揭秘JDK 25.0.1 HotFix中隐藏的3个默认参数变更(附迁移checklist)
  • OpenClaw开源贡献:为nanobot镜像开发社区技能指南
  • Windows下OpenClaw+nanobot安装避坑指南
  • 5步搞定OpenClaw+百川2-13B:飞书机器人自动化办公配置
  • C#的[StackTraceHidden]:从堆栈跟踪中隐藏方法
  • 【20年JVM老兵亲测】Java 25密封类+模式匹配+记录类三重协同时,API设计效率提升47%!
  • MATLAB数值计算实战:手把手教你实现雅可比、高斯-赛德尔和SOR迭代法(附完整代码)
  • OpenClaw+GLM-4.7-Flash:自动化代码审查
  • 数据库实战:从零掌握DML核心操作(增删改查全解析)
  • 终极指南:FXBlurView调试技巧与模糊效果异常快速定位
  • KOReader内存碎片优化终极指南:如何让电子书阅读器长期稳定运行
  • 谷粒商城课程设计
  • 5分钟快速上手:Rufus免费工具制作Windows启动盘终极指南
  • 颠覆认知的5个Stagehand实战技巧:突破AI网页自动化瓶颈的进阶策略
  • ZERO-IG:零样本学习驱动的低光图像联合去噪与自适应增强技术解析
  • AT32F403A开发板8个串口全开实战:用V2库实现多路数据同时收发(附完整代码)
  • 突破性能瓶颈:VirtualAPK插件框架下的Jetpack Compose优化实践
  • 顶刊IEEE TPE论文算法复现:永磁同步电机转速调节的抗干扰滑模控制器代码
  • Janus-Pro-7B保姆级教程:app.py源码关键函数注释与API接口扩展指引
  • Unity游戏高效转微信小游戏的实战技巧与资源优化策略
  • Ubuntu 20.04 下 PCL 1.8 从源码编译到可视化测试全流程
  • PyTorch张量操作实战:从基础运算到高效数据处理
  • OpenClaw性能调优:nanobot镜像的vllm参数详解
  • 模型微调数据准备:用OpenClaw自动标注百川2-13B-4bits的训练样本
  • OpenClaw配置详解:GLM-4.7-Flash模型参数调优手册
  • 密封类进化论:Java 25新增sealed enum、sealed record及跨模块permits声明(仅限Early-Access Build 25+)
  • USRP B210固件版本冲突?老司机教你如何降级FPGA固件搞定GNU Radio