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

SpringBoot 过滤器(Filter)与请求链路梳理

在 SpringBoot 里,Filter(过滤器)是最底层的请求处理组件,比拦截器更早、更底层。
它能对
所有请求
进行过滤、编码、跨域、日志、限流、请求头处理等。

这一篇我们讲讲Filter 是什么、怎么用、三种注册方式、实战场景、执行顺序、和拦截器的区别、完整请求链路


一、什么是 Filter过滤器?

Filter 是 Servlet 规范中的组件,运行在 Tomcat 容器层。

作用:

  • 对请求进行预处理后处理

  • 过滤、修改请求头 / 响应头

  • 统一编码设置

  • 全局跨域处理

  • 日志、限流、风控

  • 敏感词过滤

特点:

  • 拦截所有请求

    (包括静态资源、图片、HTML)

  • 比 Spring 拦截器更早执行

  • 依赖 Servlet 容器,不依赖 Spring

  • 可以决定是否放行请求


二、Filter 核心方法

只需要实现Filter接口,重写 3 个方法:

1publicinterfaceFilter{ 2 3// 初始化:项目启动时执行一次 4voidinit(FilterConfig filterConfig)throwsException; 5 6// 核心过滤逻辑(每次请求都执行) 7voiddoFilter(ServletRequest request,ServletResponse response,FilterChain chain)throwsException; 8 9// 销毁:项目关闭时执行一次 10voiddestroy(); 11}

99% 场景只需要写 doFilter


三、SpringBoot 注册 Filter 的 3 种方式

方式1:@WebFilter

1@WebFilter(urlPatterns ="/*", filterName ="demoFilter") 2publicclassDemoFilterimplementsFilter{ 3@Override 4publicvoiddoFilter(...){ 5// 过滤逻辑 6 chain.doFilter(request, response);// 放行 7} 8}

启动类加:

1@ServletComponentScan// 扫描Filter 2@SpringBootApplication 3publicclassApp{}

方式2:JavaConfig 注册

1@Configuration 2publicclassFilterConfig{ 3 4@Bean 5publicFilterRegistrationBean<DemoFilter>demoFilter(){ 6FilterRegistrationBean<DemoFilter> bean =newFilterRegistrationBean<>(); 7 bean.setFilter(newDemoFilter()); 8 bean.addUrlPatterns("/*"); 9 bean.setOrder(1);// 数字越小越先执行 10return bean; 11} 12}

方式3:Component 自动注册

1@Component 2@Order(1) 3publicclassDemoFilterimplementsFilter{}

四、统一编码过滤器

1@WebFilter("/*") 2publicclassEncodingFilterimplementsFilter{ 3@Override 4publicvoiddoFilter(ServletRequest request,ServletResponse response,FilterChain chain)throwsException{ 5 request.setCharacterEncoding("UTF-8"); 6 response.setCharacterEncoding("UTF-8"); 7 response.setContentType("application/json;charset=utf-8"); 8 chain.doFilter(request, response); 9} 10}

五、请求日志过滤器

1@Slf4j 2@WebFilter("/*") 3publicclassLogFilterimplementsFilter{ 4@Override 5publicvoiddoFilter(ServletRequest req,ServletResponse resp,FilterChain chain)throwsException{ 6HttpServletRequest request =(HttpServletRequest) req; 7 log.info("请求地址:{}", request.getRequestURI()); 8 log.info("请求方式:{}", request.getMethod()); 9 chain.doFilter(req, resp); 10} 11}

六、拦截非法请求(防盗链、黑名单)

1@Override 2publicvoiddoFilter(ServletRequest req,ServletResponse resp,FilterChain chain)throwsException{ 3HttpServletRequest request =(HttpServletRequest) req; 4String ip = request.getRemoteAddr(); 5 6if(blackList.contains(ip)){ 7 response.getWriter().write("非法请求"); 8return; 9} 10 chain.doFilter(req, resp); 11}

七、包装 Request 实现流重复读

1@Override 2publicvoiddoFilter(ServletRequest req,ServletResponse resp,FilterChain chain)throwsException{ 3// 包装 Request,让body可重复读取 4RepeatedReadRequestWrapper wrapper =newRepeatedReadRequestWrapper((HttpServletRequest) req); 5 chain.doFilter(wrapper, resp); 6}

常用于:日志记录、签名校验、全局加密解密。


八、多个 Filter 执行顺序

执行规则:
Order 数字越小,越先执行

执行流程:

请求 → Filter1 → Filter2 → Controller → Filter2 → Filter1 → 响应

九、SpringBoot 完整请求链路

请求进入顺序:

  1. Tomcat

  2. Filter(过滤器)

  3. Spring DispatcherServlet

  4. Interceptor(拦截器 preHandle)

  5. Controller

  6. Interceptor(postHandle)

  7. 视图渲染

  8. Interceptor(afterCompletion)

  9. Filter 后续处理

  10. 返回响应

一句话:Filter 最前,Interceptor 中间,Controller 最后。


十、Filter VS Interceptor

特性

Filter

Interceptor

规范

Servlet

SpringMVC

范围

所有请求

只拦截 Controller

时机

更早(容器层)

稍后(Spring层)

能获取Bean

不能

能中断请求

适用场景

编码、跨域、限流

登录、权限、日志


十一、使用建议

  • 统一编码、跨域、限流、风控、请求日志 → Filter
  • 登录鉴权、权限校验、接口日志 → Interceptor
  • 参数校验、返回封装 → Controller + AOP

十二、总结

  1. Filter 是Servlet 组件,拦截所有请求

  2. 核心方法:doFilter

  3. 注册:@WebFilter、FilterRegistrationBean

  4. 顺序:Order 越小越先执行

  5. 请求链路:Filter → Interceptor → Controller


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

相关文章:

  • MS5803-14BA I²C驱动开发:嵌入式压力传感器实战指南
  • 从MVS到NeRF的桥梁:手把手拆解MVSNeRF中的代价体与神经编码体
  • 嵌入式ADC过采样驱动文档规范与实践
  • 部署OpenClaw有哪些成本?附OpenClaw低成本部署指南
  • LLVM指令调度实战:如何用llvm-mca优化AArch64代码性能(附TSV110配置示例)
  • java面试中项目开发难题解析怎么写?
  • 3个秘诀让你轻松获取全网无损音乐:洛雪音乐音源使用指南
  • 基于python框架的高校实验室耗材管理系统vue
  • Linux下Conda+R+RStudio环境配置全攻略:从零搭建高效数据分析平台
  • TrollInstallerX终极指南:iOS 14-16.6.1系统TrollStore一键部署深度解析
  • Python 官方网站(python.org)上 Python 3.12.9 版本的 Windows 下载选项说明
  • Fun-Rec:推荐系统学习与实践的一站式解决方案
  • OpenClaw压力测试指南:GLM-4.7-Flash并发调用优化
  • 大数据领域数据架构的关键技术与应用
  • Azure IoT Hub Arduino库技术解析与迁移指南
  • Windows驱动管理工具与驱动仓库清理技术完全指南
  • 2026辽宁诚信企业法律顾问律师推荐指南:辽宁行政诉讼律师、辽宁金融纠纷律师、辽宁交通事故律师、辽宁仲裁执行律师选择指南 - 优质品牌商家
  • Eclipse反编译插件Decompiler安装与配置全攻略(附JD-Core设置技巧)
  • Open Application Model应用范围实战指南:如何组织和管理分布式应用边界
  • 为什么加了索引还慢?MySQL 索引失效 12 个排查点
  • 文件驱动的智能体通信:构建高可靠分布式协作系统的架构解析与实践指南
  • 如何用TensorFlow的DeepLabV3+实现Cityscapes街景分割?完整训练+验证+可视化流程
  • FastAPI热重载卡顿?降级uvicorn到0.20.0可能是最快解决方案(附原因分析)
  • Nacos 2.4.1 连接人大金仓踩坑记:除了改驱动,这个函数也得动!
  • IS31FL3733A LED驱动库深度解析与嵌入式实战指南
  • Vivado Chipscope调试实战:如何快速定位FPGA设计中的DRC警告(附避坑指南)
  • 量子启发算法在高维推理任务中的应用研究
  • 保姆级教程:在MMDetection3D中手把手调试PointPillars网络结构(附代码逐行解析)
  • Pololu Maestro伺服控制器底层通信协议与嵌入式驱动开发
  • GyverMotor2电机库:嵌入式直流电机控制工程实践指南