Filter、Interceptor、Spring AOP 的执行顺序
引言
在我们的日常开发工作中,Filter
(过滤器)、Interceptor
(拦截器)和 AOP
(面向切面编程)是非常常用的 3 种请求处理技术。在不同的应用场景中,使用它们都可以在不影响主业务逻辑的前提下为系统增加额外的功能。
三者之间对比
-
Filter
是Java Servlet
规范的一部分,它工作在Servlet
容器层面,是Servlet
容器级别的,适用于所有进入应用的 HTTP 请求。 -
Interceptor
是 Spring MVC 框架提供的一种请求处理机制,是属于框架级别的。通过Interceptor
章节的源码可以看出,Interceptor
工作在 Spring MVC 分发处理请求时,而分发请求的类是DispatcherServlet
,它是一个Servlet
,根据Servlet
规范,Filter
是先于Servlet
执行的。所以Filter
要比Interceptor
优先执行。 -
Spring AOP 是 Spring 框架提供的面向切面编程的支持,允许我们在不改变原有业务逻辑的前提下,集中处理横切关注点。它的执行时机是在特定的连接点,也就是请求已经到了我们
controller
中的某个方法时才会触发,而Interceptor
在执行查找到的handler
之前就已经被调用了,所以Interceptor
要先于 Spring AOP 执行。一般情况是这样。若将AOP切在spring框架层面的代码上就不一定了。
执行顺序如下图:
在Spring Web项目中,发起一个http请求,执行顺序依次是:Filter、DispatcherServlet、HandlerInterceptor、Controller。准确的说应该是filter的doFilter()->HandlerInterceptor类的preHandle()
本篇主要基于 SpringBoot 介绍了过滤器、拦截器和 Spring AOP,通过学习其基本知识了解到了它们工作时的执行顺序。实际上,其实无论是过滤器还是拦截器,都可以被视为 AOP 思想的具体实现形式,尽管它们各自工作在不同的层次上。
注:相同的interceptor中order越小越靠前执行
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new FirstInterceptor()).order(1);registry.addInterceptor(new SecondInterceptor()).order(2);}
}