过滤器和拦截器

在Spring Boot框架中,过滤器(Filter)和拦截器(Interceptor)仍然存在,并且使用方式上有一些区别。以下是针对Spring Boot框架的过滤器和拦截器的一些特点:

过滤器(Filter)

  1. 注册方式: 在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;
    }
  2. 生命周期: 过滤器的生命周期由Servlet容器管理,与原生Servlet过滤器一致。

拦截器(Interceptor)

  1. 注册方式: Spring Boot中的拦截器通过实现HandlerInterceptor接口,并通过WebMvcConfigureraddInterceptors方法进行注册。

    typescript 复制代码
    @Configuration
    public class MyWebMvcConfigurer implements WebMvcConfigurer {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new MyInterceptor())
                    .addPathPatterns("/api/**")
                    .excludePathPatterns("/public/**"); // 可以配置排除拦截的路径
        }
    }
  2. 生命周期: 拦截器的生命周期由Spring容器管理,而且更为灵活,可以通过依赖注入等方式进行更复杂的操作。

共同点

  1. 链式执行: 过滤器和拦截器在Spring Boot中都可以配置为链式执行,一个请求可以通过多个过滤器或拦截器的处理。
  2. 处理顺序: 都可以指定处理顺序,即确定它们在链中的执行顺序。

不同点

  1. 注册方式: 过滤器通过FilterRegistrationBean注册,而拦截器通过实现HandlerInterceptor接口并通过WebMvcConfigurer注册。
  2. 生命周期: 过滤器的生命周期由Servlet容器管理,而拦截器的生命周期由Spring容器管理,更为灵活。
  3. 作用范围: 过滤器对所有请求起作用,而拦截器只作用于Spring MVC的请求处理阶段。
  4. 主要用途: 过滤器主要用于修改请求和响应、过滤敏感信息等,而拦截器主要用于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)

拦截器的执行顺序由注册时的顺序决定。在WebMvcConfigureraddInterceptors方法中,通过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方法都是设置执行顺序,值越小越先执行。

执行顺序总结

  1. 过滤器的执行顺序由Servlet容器管理,通过web.xml配置或FilterRegistrationBean中的setOrder方法指定。
  2. 拦截器的执行顺序由注册时的顺序决定,通过WebMvcConfigureraddInterceptors方法中的order方法指定。

先后顺序呢?

在Spring Boot中,过滤器(Filter)和拦截器(Interceptor)的执行顺序取决于它们在应用中的注册顺序。一般情况下,过滤器的执行顺序在拦截器之前。

具体来说:

  1. 过滤器(Filter)的执行顺序

    • 过滤器的执行顺序由Servlet容器管理,一般按照在web.xmlFilterRegistrationBean中的配置顺序执行。
    • 通过setOrder方法设置过滤器执行顺序,值越小越先执行。
  2. 拦截器(Interceptor)的执行顺序

    • 拦截器的执行顺序由在WebMvcConfigureraddInterceptors方法中的注册顺序决定。
    • 通过order方法设置拦截器执行顺序,值越小越先执行。

一般情况下,过滤器的执行顺序在拦截器之前,因为过滤器是基于Servlet规范的,而拦截器是Spring MVC框架自身的一部分。在一个请求到达Spring MVC前,会先经过过滤器链,然后才是拦截器链。

在通常的情况下,过滤器在拦截器之前执行。过滤器是Servlet规范中定义的,它在请求进入Servlet容器之前执行,而拦截器是Spring MVC框架中定义的,它在请求进入Spring MVC的DispatcherServlet之前执行。

所以执行顺序通常是:

  1. 过滤器(Filter) :在请求进入Servlet容器之前执行。
  2. 拦截器(Interceptor) :在请求进入Spring MVC的DispatcherServlet之前执行。

在请求返回给客户端时,执行顺序是:

  1. 拦截器(Interceptor) :在DispatcherServlet将响应返回给客户端时执行。
  2. 过滤器(Filter) :在响应返回给客户端时执行。
相关推荐
夜月行者39 分钟前
如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue
java·后端·ssm
Yvemil71 小时前
RabbitMQ 入门到精通指南
开发语言·后端·ruby
sdg_advance1 小时前
Spring Cloud之OpenFeign的具体实践
后端·spring cloud·openfeign
碳苯2 小时前
【rCore OS 开源操作系统】Rust 枚举与模式匹配
开发语言·人工智能·后端·rust·操作系统·os
kylinxjd2 小时前
spring boot发送邮件
java·spring boot·后端·发送email邮件
2401_857439695 小时前
Spring Boot新闻推荐系统:用户体验优化
spring boot·后端·ux
进击的女IT6 小时前
SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS
java·spring boot·后端
一 乐7 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
艾伦~耶格尔10 小时前
Spring Boot 三层架构开发模式入门
java·spring boot·后端·架构·三层架构
man201710 小时前
基于spring boot的篮球论坛系统
java·spring boot·后端