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

Filter 的加载机制 和 Servlet 容器(如 Tomcat)的请求处理流程

Spring Boot 中Filter 的加载机制Servlet 容器(如 Tomcat)的请求处理流程。下面我来系统性地解释为什么请求会先经过AuthFilter,以及整个流程背后的原理。


一、请求处理的基本流程(Servlet 规范)

在基于 Servlet 的 Web 应用(包括 Spring Boot 内嵌 Tomcat)中,所有 HTTP 请求都会先进入Servlet 容器(如 Tomcat),然后:

  1. 容器根据 URL 匹配对应的Filter 链(Filter Chain)
  2. 按照注册顺序依次执行每个 Filter 的doFilter()方法
  3. 所有 Filter 执行完后,才会将请求交给目标Servlet(在 Spring Boot 中通常是DispatcherServlet
  4. DispatcherServlet再将请求分发给对应的Controller

因此:Filter 是在 Controller 之前执行的,这是 Servlet 规范决定的。


二、Spring Boot 如何注册 Filter?

Spring Boot 提供了多种方式注册自定义 Filter,常见的是通过@Bean+FilterRegistrationBean

@Bean public FilterRegistrationBean<AuthFilter> authFilter() { FilterRegistrationBean<AuthFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new AuthFilter()); registration.setOrder(3); // 设置执行顺序 registration.addUrlPatterns("/*"); // 匹配所有请求 return registration; }
  • setOrder(3)表示该 Filter 在 Filter 链中的优先级(数字越小越先执行)
  • Spring Boot 启动时会自动扫描并注册这些FilterRegistrationBean
  • 最终,这些 Filter 会被注册到内嵌的Tomcat Servlet 容器

注意:除了自定义 Filter,Spring Security、字符编码 Filter(CharacterEncodingFilter)等也会被自动注册,它们也有各自的 Order。


三、Filter Chain 的执行顺序

Filter 的执行顺序由@Order注解或FilterRegistrationBean.setOrder()决定。例如:

OrderFilter 名称作用
1CharacterEncodingFilter设置请求/响应编码
2SomeLoggingFilter记录请求日志
3AuthFilter执行身份认证逻辑
...Other Filters其他过滤器
最后DispatcherServlet分发请求到 Controller

所以当一个请求进来时:

  1. Tomcat 构建匹配该 URL 的 Filter 链
  2. 按 Order 从小到大依次调用每个 Filter 的doFilter()
  3. 到达AuthFilter(Order=3)时,执行认证逻辑:
    • 如果认证失败 → 直接返回 401/403,不再继续调用 chain.doFilter()
    • 如果认证成功 → 调用chain.doFilter(request, response),继续下一个 Filter 或进入 Controller

四、为什么“验证通过后才会到达 Controller”?

因为 Filter 是前置拦截器。只有当所有 Filter 都调用了chain.doFilter(),请求才会最终传递给DispatcherServlet,进而路由到你的@RestController

如果AuthFilter发现 token 无效,它可以直接:

response.setStatus(HttpStatus.UNAUTHORIZED.value()); return; // 不调用 chain.doFilter()

这样请求就不会继续向下传递,Controller 根本不会被执行。


五、总结:关键点

关键点说明
Filter 是 Servlet 规范的一部分所有请求必须先经过 Filter 链
Spring Boot 自动注册 Filter通过FilterRegistrationBean@WebFilter
执行顺序由 Order 决定数字越小越先执行
AuthFilter 在 Order=3 位置在它之前的 Filter 已执行,之后的还没执行
认证失败可中断链路不调用chain.doFilter()即可阻止请求到达 Controller

补充建议

  • 如果使用Spring Security,通常不需要手写AuthFilter,因为 Security 本身就是一个强大的 Filter(springSecurityFilterChain),且 Order 非常靠前(默认 -100)。
  • 手动实现认证 Filter 适用于轻量级场景或定制需求。
http://www.jsqmd.com/news/192490/

相关文章:

  • 科创知识图谱:构建数据化智能引擎,驱动科技成果转化新生态
  • 你的拍一拍设置了啥
  • 把田园搬回家!2026年美式田园风装修公司精选指南 - 品牌测评鉴赏家
  • 亲测【10款降ai率工具红黑榜!论文降aigc到底哪个强?】(内附aigc免费降重指南)
  • 想进郭靖宇郭家班?官方渠道与硬实力是关键
  • B站UP主创作激励政策:AI生成视频能否获得分成?
  • 怼人天花板!吵架稳赢不费力
  • 【C#数据过滤终极指南】:掌握高效数据处理的7种核心技巧
  • AI智能随访系统:用技术重构诊后健康守护
  • 微信联系科哥获取支持:HeyGem用户问题反馈渠道说明
  • 向艳C语言第5章课后答案详解,数组字符串习题这样学才对
  • 【大模型开发必看】一文读懂MCP协议面试指南,建议收藏反复学习
  • 2026 年快手去水印工具全面解析:TOP7 免费工具,秒级处理 + 高清无损不限次数 - 苏木2025
  • Intuition 英文单词学习
  • 多卡并行支持吗?HeyGem当前仅支持单GPU运行说明
  • 携程旅游线路推荐:不同方言版本数字人覆盖全国市场
  • Blender三维整合路径:将HeyGem输出导入动画工程
  • 内网穿透实现公网访问HeyGem:frp/ngrok配置教程
  • C#集合初始化新写法:8种你不知道的表达式技巧(资深架构师推荐)
  • 【.NET开发者必看】:集合表达式+扩展方法=生产力翻倍
  • HeyGem数字人系统运行日志在哪看?实时监控技巧分享
  • 从毫秒到微秒:重构C#拦截器的7个不为人知的性能技巧
  • FBMC基本调制实现详解
  • Mac用户如何挂载服务器路径查看HeyGem生成内容?
  • 2025年大理石翻新养护哪家好?最新排行深度解析,昌平知名的大理石翻新养护商家怎么选择精选优质品牌解析 - 品牌推荐师
  • 从Prompt到多模态:大模型核心术语全解析,程序员必看收藏指南
  • C# 12拦截器配置完全手册,重构前必须掌握的8项核心技术
  • Windows远程桌面访问HeyGem输出目录的小技巧
  • 【C# 12顶级语句优化秘籍】:掌握高效编程的7个关键技巧
  • 【收藏必备】AI大模型术语全解析:从零开始,小白也能看懂的入门指南