在Spring Boot框架中,过滤器(Filter)和拦截器(Interceptor)仍然存在,并且使用方式上有一些区别。以下是针对Spring Boot框架的过滤器和拦截器的一些特点:
过滤器(Filter)
-
注册方式: 在Spring Boot中,过滤器的注册可以通过
FilterRegistrationBean
来完成。通过创建FilterRegistrationBean
实例,设置过滤器并添加到FilterRegistrationBean
中,然后将FilterRegistrationBean
注册到Spring容器。typescript@Bean public FilterRegistrationBean<MyFilter> myFilter() { FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new MyFilter()); registrationBean.addUrlPatterns("/api/*"); return registrationBean; }
-
生命周期: 过滤器的生命周期由Servlet容器管理,与原生Servlet过滤器一致。
拦截器(Interceptor)
-
注册方式: Spring Boot中的拦截器通过实现
HandlerInterceptor
接口,并通过WebMvcConfigurer
的addInterceptors
方法进行注册。typescript@Configuration public class MyWebMvcConfigurer implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/api/**") .excludePathPatterns("/public/**"); // 可以配置排除拦截的路径 } }
-
生命周期: 拦截器的生命周期由Spring容器管理,而且更为灵活,可以通过依赖注入等方式进行更复杂的操作。
共同点
- 链式执行: 过滤器和拦截器在Spring Boot中都可以配置为链式执行,一个请求可以通过多个过滤器或拦截器的处理。
- 处理顺序: 都可以指定处理顺序,即确定它们在链中的执行顺序。
不同点
- 注册方式: 过滤器通过
FilterRegistrationBean
注册,而拦截器通过实现HandlerInterceptor
接口并通过WebMvcConfigurer
注册。 - 生命周期: 过滤器的生命周期由Servlet容器管理,而拦截器的生命周期由Spring容器管理,更为灵活。
- 作用范围: 过滤器对所有请求起作用,而拦截器只作用于Spring MVC的请求处理阶段。
- 主要用途: 过滤器主要用于修改请求和响应、过滤敏感信息等,而拦截器主要用于AOP切面编程、权限校验、日志记录等。
顺序呢?
在Spring Boot中,过滤器(Filter)和拦截器(Interceptor)的执行顺序是不同的,这是因为它们分别作用在不同的层次。
过滤器(Filter)
过滤器的执行顺序是由Servlet容器(如Tomcat)决定的,通常按照过滤器在web.xml
中的配置顺序执行。具体顺序是由过滤器在FilterRegistrationBean
中的注册顺序决定,该顺序可以通过setOrder
方法指定。
typescript
@Bean
public FilterRegistrationBean<MyFilter> myFilter() {
FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter());
registrationBean.addUrlPatterns("/api/*");
registrationBean.setOrder(1); // 设置过滤器执行顺序
return registrationBean;
}
拦截器(Interceptor)
拦截器的执行顺序由注册时的顺序决定。在WebMvcConfigurer
的addInterceptors
方法中,通过registry.addInterceptor()
的顺序来指定拦截器的执行顺序。
typescript
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/api/**")
.order(1); // 设置拦截器执行顺序
}
}
需要注意的是,拦截器的order
方法和过滤器的setOrder
方法都是设置执行顺序,值越小越先执行。
执行顺序总结
- 过滤器的执行顺序由Servlet容器管理,通过
web.xml
配置或FilterRegistrationBean
中的setOrder
方法指定。 - 拦截器的执行顺序由注册时的顺序决定,通过
WebMvcConfigurer
的addInterceptors
方法中的order
方法指定。
先后顺序呢?
在Spring Boot中,过滤器(Filter)和拦截器(Interceptor)的执行顺序取决于它们在应用中的注册顺序。一般情况下,过滤器的执行顺序在拦截器之前。
具体来说:
-
过滤器(Filter)的执行顺序:
- 过滤器的执行顺序由Servlet容器管理,一般按照在
web.xml
或FilterRegistrationBean
中的配置顺序执行。 - 通过
setOrder
方法设置过滤器执行顺序,值越小越先执行。
- 过滤器的执行顺序由Servlet容器管理,一般按照在
-
拦截器(Interceptor)的执行顺序:
- 拦截器的执行顺序由在
WebMvcConfigurer
的addInterceptors
方法中的注册顺序决定。 - 通过
order
方法设置拦截器执行顺序,值越小越先执行。
- 拦截器的执行顺序由在
一般情况下,过滤器的执行顺序在拦截器之前,因为过滤器是基于Servlet规范的,而拦截器是Spring MVC框架自身的一部分。在一个请求到达Spring MVC前,会先经过过滤器链,然后才是拦截器链。
在通常的情况下,过滤器在拦截器之前执行。过滤器是Servlet规范中定义的,它在请求进入Servlet容器之前执行,而拦截器是Spring MVC框架中定义的,它在请求进入Spring MVC的DispatcherServlet
之前执行。
所以执行顺序通常是:
- 过滤器(Filter) :在请求进入Servlet容器之前执行。
- 拦截器(Interceptor) :在请求进入Spring MVC的
DispatcherServlet
之前执行。
在请求返回给客户端时,执行顺序是:
- 拦截器(Interceptor) :在
DispatcherServlet
将响应返回给客户端时执行。 - 过滤器(Filter) :在响应返回给客户端时执行。