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

【springbot整合拦截器】

springboot 整合拦截器,纯AI查询整理的,供自己查看用,不清晰的自己再搜下其他资料

拦截器的概述
作用:拦截 Controller 请求,在进入 Controller 之前 / 之后 / 渲染页面前后做处理
典型场景:登录校验、日志、权限、接口限流、请求头处理
只拦截 Controller,不拦截静态资源、过滤器(Filter)范围更大

整合拦截器步骤

  1. 编辑拦截器
packagecom.example.demo002.interceptor;importorg.springframework.stereotype.Component;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;@ComponentpublicclassLoginInterceptorimplementsHandlerInterceptor{/** * 进入Controller之前执行 */@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println("【拦截器】preHandle:请求进入Controller前");// 示例:判断是否登录Objectuser=request.getSession().getAttribute("user");if(user==null){response.getWriter().write("请先登录");returnfalse;// 不放行}returntrue;// 放行}/** * Controller执行完毕,渲染页面前执行 */@OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System.out.println("【拦截器】postHandle:Controller执行完");}/** * 整个请求完全结束后执行 */@OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System.out.println("【拦截器】afterCompletion:请求结束");}}

preHandle是进入Controller之前执行,但是postHandle和afterCompletion具体是什么区别呢?

首先,执行顺序如下:

请求流程:
preHandle → Controller执行 → postHandle → 视图渲染 → afterCompletion

详细区别:

  1. postHandle(Controller 执行完,视图渲染前)
  • 修改 ModelAndView 对象(添加额外的模型数据或修改视图名称)
    在响应返回给客户端之前进行最后的数据处理
  • 限制:如果 Controller 抛出异常,这个方法不会执行
  1. afterCompletion(整个请求完全结束)
  • 执行时机:视图渲染完成,响应已经发送给客户端
  • 资源清理(关闭连接、释放锁等)
  • 记录日志(记录请求总耗时)
  • 性能监控
  • 特点:无论是否发生异常,这个方法都会执行
  • 参数 Exception ex:可以获取请求过程中发生的异常(如果没有异常则为 null)
  1. 注册拦截器

拦截器必须注册才能生效。
为什么需要注册?
虽然你在 LoginInterceptor 类上加了 @Component 注解,但这只是让它被 Spring 容器管理,并不会自动注册为拦截器。你需要通过配置类明确告诉 Spring MVC:

  • 哪些请求路径需要被拦截
  • 哪些请求路径需要排除

创建新的一个拦截器,和上面的基本一样,根据自己需要来创建。

packagecom.example.demo002.interceptor;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importorg.springframework.stereotype.Component;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;@ComponentpublicclassTestInterCeptorimplementsHandlerInterceptor{@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{// 记录请求开始时间request.setAttribute("startTime",System.currentTimeMillis());System.out.println("【拦截器】preHandle:请求进入Controller前");returntrue;}@OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{// 可以在这里添加额外的模型数据if(modelAndView!=null){modelAndView.addObject("commonData","公共数据");}System.out.println("【拦截器】postHandle:Controller执行完,视图渲染前");}@OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{// 计算请求总耗时LongstartTime=(Long)request.getAttribute("startTime");longendTime=System.currentTimeMillis();System.out.println("【拦截器】afterCompletion:请求结束,耗时:"+(endTime-startTime)+"ms");// 如果有异常,记录异常信息if(ex!=null){System.out.println("【拦截器】发生异常:"+ex.getMessage());}}}

2.创建拦截器配置类
你需要创建一个配置类来实现 WebMvcConfigurer 接口:

packagecom.example.demo002.config;importcom.example.demo002.interceptor.LoginInterceptor;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{@AutowiredprivateLoginInterceptorloginInterceptor;@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(loginInterceptor).addPathPatterns("/**")// 拦截所有路径.excludePathPatterns(// 排除不需要拦截的路径"/login",// 登录接口"/register",// 注册接口"/static/**",// 静态资源"/css/**","/js/**","/images/**");}}

3.总结
Spring Boot 拦截器 = 实现 HandlerInterceptor + 注册到 WebMvcConfigurer
只拦截 Controller,不拦截静态资源
三个方法:preHandle /postHandle/afterCompletion
可配置拦截、放行路径

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

相关文章:

  • Wan2.2-I2V-A14B网络优化:解决403 Forbidden等API调用常见错误
  • AI Agent 架构图解:大模型、记忆、RAG 与工具调用的协同机制康
  • Arduino I²C四段数码管驱动库:轻量、稳定、即用
  • ESP32S2开发板变身USB网卡:从硬件连接到配网实战
  • 我不是狐狸,我是那Harness Engineering冻
  • 从零开始学提示工程:如何用角色提示让AI生成风格化内容(附80年代游戏博客案例)
  • LightOnOCR-2-1B效果对比:vs PaddleOCR、EasyOCR在多语言场景表现
  • 科普大白话:CPU(中央处理器)
  • PyTorch实战指南:深入理解卷积层的参数调优与图像处理
  • DLA:深度网络特征融合的革新与实践
  • 2026年安徽区域实力双T混凝土板企业名录:马鞍形屋面板、马鞍板屋面、马鞍板屋顶、双t坡板、双t平板、双t板屋面板选择指南 - 优质品牌商家
  • 口碑好的不锈钢彩涂板服务商
  • LP8 CO₂传感器Arduino库详解:MODBUS-RTU通信与NDIR数据处理
  • Vue中手动取消watch监听的最佳实践与实现原理
  • 从俾斯麦海之战到现代商业:零和博弈的实战应用与避坑指南
  • 保姆级教程:Phi-3-vision-128k-instruct图文对话模型快速上手,开箱即用
  • html标签怎么处理多语言页面_lang属性细化写法【操作】
  • 不要让接口过早失去可选项冠
  • RAGflow实战:从多模态文档解析到智能问答系统构建
  • MetaboAnalystR 4.0:代谢组学数据分析的终极R包指南
  • 微服务安全移动端架构
  • 当Informer遇上BiLSTM:我用Python搭了个‘并行预测’模型,单步预测R2干到0.98
  • 新手入门RTOS,别再纠结了!从RT-Thread和FreeRTOS的实战项目选择说起
  • RAG分块策略实战:5种方法代码对比+真实业务场景选择指南(附性能测试数据)
  • 揭秘低查重AI教材编写技巧,让AI写教材更轻松高效!
  • PCF8575 16位I²C IO扩展器原理与工程实践
  • STM32duino VL53L0X驱动深度解析:ToF传感器嵌入式实践指南
  • 金融行业数字员工选型指南(2024):合规、双引擎、信创与POC验证
  • 大模型为何在东南亚语系集体“失语”?SITS2026首席架构师首曝17种低资源语言适配黑盒方案
  • avue-crud实战:如何优雅实现自定义弹窗表格选择器(附完整代码)