Spring拦截器HandlerInterceptor与Filter方法执行顺序探究

news/2025/10/12 22:46:30/文章来源:https://www.cnblogs.com/nuccch/p/19137436

单个拦截器与Controller方法的执行顺序

拦截器的preHandle方法在进入到Controller方法之前执行,且只有当方法返回true时才能进入到被拦截的Controller方法;如果该方法返回false,则被拦截的Controller方法不会执行,且拦截器中的postHandleafterCompletion均不不会执行。

当拦截器的preHandle方法返回true时,各方法调用顺序如下:
1.拦截器的preHandle方法
2.Controller方法
3.拦截器的postHandle方法
4.拦截器的afterCompletion方法

当拦截器的preHandle方法返回true时,如果Controller方法中抛出异常,则各方法调用顺序如下:
1.拦截器的preHandle方法
2.Controller方法
3.使用@ControllerAdvice注解标记的全局异常拦截器
4.拦截器的afterCompletion方法

注意: 当Controller方法抛出异常时,拦截器的postHandle方法是不会执行的。

多个拦截器与Controller方法的执行顺序

当存在多个拦截器时,拦截器的执行顺序与它们的注册顺序一致,如下:

@Configuration
public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/**");registry.addInterceptor(new LogInterceptor()).addPathPatterns("/**");}
}

由于TokenInterceptor先于LogInterceptor注册,所以TokenInterceptor将先被访问,它们的方法访问顺序为:
1.TokenInterceptor.preHandle方法
2.LogInterceptor.preHandle方法
3.Controller方法
4.LogInterceptor.postHandle方法
5.TokenInterceptor.postHandle方法
6.LogInterceptor.afterCompletion方法
7.TokenInterceptor.afterCompletion方法

拦截器方法执行顺序-业务方法正常执行

注意: 由于TokenInterceptor.preHandle方法最先被执行,如果该方法返回false时,则后面的拦截器方法和Controller方法都不会执行。

另外,当TokenInterceptor.preHandle方法返回true时,如果Controller方法抛出异常,则多个拦截器与Controller方法之间的执行顺序如下:
1.TokenInterceptor.preHandle方法
2.LogInterceptor.preHandle方法
3.Controller方法
4.使用@ControllerAdvice注解标记的全局异常拦截器
5.LogInterceptor.afterCompletion方法
6.TokenInterceptor.afterCompletion方法

拦截器方法执行顺序-业务方法执行异常

Filter与拦截器方法的执行顺序

一言以蔽之,Filter的doFilter方法会在所有拦截器方法之前执行,假设同时存在过滤器AuthFilter和拦截器TokenInterceptor,他们的配置参数如下:

@WebFilter(filterName = "AuthFilter", urlPatterns = "/*")
public class AuthFilter implements Filter {}registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/**");

则它们的方法执行顺序如下:
1.AuthFilter.doFilter方法
2.TokenInterceptor.preHandle方法
3.Controller方法
4.TokenInterceptor.postHandle方法
5.TokenInterceptor.afterCompletion方法

Filter与拦截器的作用及区别如下图所示:

  • Filter是Servlet规范中的组件,依赖servlet容器,拦截所有Servlet请求
  • 拦截器(Interceptor)是Spring组件,只拦截特定的路径

Tomcat_Filter_Servlet_Interceptor_Controller

多个Filter之间的执行顺序

Filter的执行顺序取决于它们的注册方式:

场景1: 实现javax.servlet.Filter接口,在web.xml文件中注册Filter

当在web.xml文件中注册Filter时,Filter的执行顺序取决于他们的注册顺序。

场景2: 实现javax.servlet.Filter接口,使用注解@WebFilter定义Filter

当用注解@WebFilter定义Filter时,Filter的执行顺序取决于Filter的类名字母顺序。

场景3: 实现javax.servlet.Filter接口,在Spring环境中通过org.springframework.boot.web.servlet.FilterRegistrationBean注册

如下示例:

@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<AuthFilter> authFilter() {FilterRegistrationBean<AuthFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setOrder(2);registrationBean.setFilter(new AuthFilter());registrationBean.addUrlPatterns("/*");return registrationBean;}@Beanpublic FilterRegistrationBean<LogFilter> logFilter() {FilterRegistrationBean<LogFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setOrder(1);registrationBean.setFilter(new LogFilter());registrationBean.addUrlPatterns("/*");return registrationBean;}@Beanpublic FilterRegistrationBean<MDCFilter> mdcFilter() {FilterRegistrationBean<MDCFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setOrder(0);registrationBean.setFilter(new MDCFilter());registrationBean.addUrlPatterns("/*");return registrationBean;}
}

通过org.springframework.boot.web.servlet.FilterRegistrationBean注册Filter时,Filter的执行顺序取决于注册时通过setOrder()方法设置的属性值大小,值越小越先被执行。

场景4: 在Spring环境中,实现org.springframework.boot.web.servlet.filter.OrderedFilter接口

在Spring环境中实现org.springframework.boot.web.servlet.filter.OrderedFilter接口时,Filter的执行顺序取决于getOrder()方法的返回值,值越小越先被执行。

特别注意: 此时Filter必须注入到Spring IoC容器中才会生效(可以使用注解@Component实现)

场景5:在Spring环境中,继承org.springframework.web.filter.OncePerRequestFilter抽象类

在Spring环境中实现org.springframework.web.filter.OncePerRequestFilter抽象类时,Filter的执行顺序取决于类名字母顺序。

特别注意: 此时Filter必须使用注入到Spring IoC容器中才会生效(可以使用注解@Component实现)

最后总结

关于Spring拦截器方法,Filter方法,全局异常拦截器(使用注解@ControllerAdvice)方法,与Controller方法的执行顺序总结如下图所示:

场景1:Controller方法不会抛异常

Filter方法执行顺序-业务方法正常执行

场景2:Controller方法抛出异常

Filter方法执行顺序-业务方法抛出异常

【参考】
过滤器Filter实现及执行顺序
spring boot 实现多个 interceptor 并指定顺序
spring HandlerInterceptor方法的调用顺序
Springboot过滤器Filter和拦截器Inteceptor详解及使用场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业自动化立体库WMS解决方案(42页PPT) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025精加工车间恒温恒湿系统TOP5榜单:精准控温与高效节

2025精加工车间恒温恒湿系统TOP5榜单:精准控温与高效节能随着工业技术的不断进步,精加工车间对环境控制的要求越来越高。恒温恒湿系统作为确保车间内温度和湿度稳定的关键设备,其重要性不言而喻。本文将为您推荐202…

2025数控滚齿机订制厂家权威推荐:高精度与高效能的首选品牌

2025数控滚齿机订制厂家权威推荐:高精度与高效能的首选品牌随着制造业的不断发展和技术进步,数控滚齿机在精密齿轮加工领域的作用愈发重要。选择一家高质量、高效率的数控滚齿机厂家对于企业的生产至关重要。本文将从…

2025婚纱摄影工作室权威推荐榜:捕捉幸福瞬间的创意大师

2025婚纱摄影工作室权威推荐榜:捕捉幸福瞬间的创意大师在当今社会,婚纱摄影已经不仅仅是记录新人美好时刻的一种方式,更是一种艺术创作。随着技术的发展和消费者需求的多样化,婚纱摄影行业也在不断进化。为了帮助筛…

详细介绍:初学者小白复盘11之——指针(1)

详细介绍:初学者小白复盘11之——指针(1)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

2025-10-12

2025-10-12之前做到了“ELF文件和链接”这一节,今天重新回想一下接着往下做。 发现做到了“用RTL实现最简单的处理器”这里,verilog已经写完了,但是用verilogtor搭建得仿真环境有点问题,明天再研究吧

hex、bin、axf文件的区别

AXF 文件: 是编译器(如 ARM GCC, Keil, IAR)生成的调试文件。它包含最终的可执行机器码、调试信息(变量名、函数名、行号等)和丰富的元数据(如段地址)。主要用于调试。HEX 文件: 是一种带有地址信息的标准烧录…

20232417 2025-2026-1 《网络与系统攻防技术》实验一实验报告

1.实验内容 本次实验围绕 Linux 可执行文件 pwn1 的缓冲区溢出(BOF)漏洞与 shellcode 注入展开学习,核心是通过多种技术手段篡改程序执行流程,实现未授权代码执行。具体包括:直接修改程序机器指令,将 main 函数调…

2025黄金回收品牌TOP5权威榜单:值得信赖的高性价比厂家

2025黄金回收品牌TOP5权威榜单:值得信赖的高性价比厂家随着黄金市场的不断升温,黄金回收行业也迎来了新的发展机遇。越来越多的企业和个人开始关注黄金回收,希望通过这一渠道实现资产的有效管理和增值。然而,在众多…

P6005 [USACO20JAN] Time is Mooney G 题解

题目描述 Bessie 正在安排前往牛尼亚的一次出差,那里有 \(N\)(\(2 \leq N \leq 1000\))个编号为 \(1 \ldots N\) 的城市,由 \(M\)(\(1 \leq M \leq 2000\))条单向的道路连接。Bessie 每次访问城市 \(i\) 都可以赚…

3.2 优势演员–评论家算法(Advantage Actor-Critic, A3C)

优势演员–评论家算法(Advantage Actor-Critic, A3C)演员–评论家(Actor–Critic)算法 策略梯度定理提供了一种能够基于单步转移估计梯度的架构: \[\nabla_\theta J(\theta) = \mathbb{E}_{s \sim \rho_\theta, a…

20232326 2025-2026-1 《网络与系统攻防技术》实验一实验报告

20232326 2025-2026-1 《网络与系统攻防技术》实验一实验报告 1. 实验内容 1.1 缓冲区溢出漏洞核心定义:程序向预设缓冲区写入数据时超出容量,溢出数据覆盖相邻内存(如函数返回地址、栈底指针ebp),最终篡改程序执…

[数据分析/BI] Microsoft Power BI 使用指南

1 概述:Power BI 什么是 Power BI?Power BI 是由微软发布的一款商业智能(BI)软件,或者说数据分析工具。Microsoft Power BI 是一个完整的报表解决方案,通过开发工具和联机平台提供数据准备、数据可视化、分发和管…

机器人技术在现实世界中的挑战与创新

本文探讨了在现实环境中构建与人类互动的机器人系统所面临的技术挑战,包括开放世界的不确定性、持续学习、多机器人协作以及人机共存等问题,涉及机器学习模型优化、系统架构设计和安全交互等核心技术。机器人技术在现…

Motorola和Inter的区别

位的顺序 MSB: Most Significant Bit 最高有效位,一个二进制数的最左边的那一位,他拥有最高的权重,他的值是1还是0对整个数的影响最大。2的N-1次方。 LSB: Least Significant Bit 最低有效位,一个二进制数的最右边…

设计模式-行为型设计模式(针对对象之间的交互) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

ROS2之TF

TFTF(Transform Frame) 是 ROS2 中用于维护多个坐标系之间空间关系的坐标变换系统。它可以实时跟踪机器人各个部分(如底盘、传感器、地图等)在三维空间中的位置与姿态,通过建立一棵动态的 坐标变换树(TF Tree),…

代码源2025长训

10/9 Day 16 A:非常可惜写的35pts暴力全部没分,也是神人了。首先需要一个小分讨,如果原树有双重心那么就会有如下情况:该边后的双重心不变和有可能改变;如果不变的情况就是说,对于双重心 \((u,v)\) ,我们加减边…

代码源国庆模拟赛

ABC 423 做题顺序a->b->c->d->c->d->c->e->d,吃了C*3+D*6共9发罚时,全部WA*1 C把一个减号左右两边写反导致出现负数爆炸了 D:能用prique别用set,常数大还会把元素去重,元素去重是很关键的…

CSP-S模拟30 2025.10.12

A. 灯若辰星 题面link 赛时 一眼看出\(F\)属于第一类斯特林数,但\(G\)死活找不出规律QAQ。 然后又没对\(F mod 2\)进行分讨,0pts遗憾离场。。。 正解 让我们分开求解 F 手搓几个样例可发现其中的递推关系 rt: 考虑以…