过滤器和拦截器

在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) :在响应返回给客户端时执行。
相关推荐
君若雅8 分钟前
我如何借助 Trae 三分钟搞定开源项目中的隐藏 BUG
java·后端·trae
汪子熙21 分钟前
浅谈笔者对 AI 技术降低软件项目开发成本的一些思考
后端
IT-ZXT88828 分钟前
Spring 框架之IOC容器加载重要组件
java·后端·spring
用户67570498850231 分钟前
HTTP2.0 从原理到实践,保证把你治得服服帖帖!
后端
noravinsc1 小时前
django paramiko 跳转登录
后端·python·django
声声codeGrandMaster1 小时前
Django之表格上传
后端·python·django
ghie90901 小时前
SpringCloud-基于SpringAMQP实现消息队列
后端·spring cloud·ruby
程序员葵安2 小时前
【Java Web】9.Maven高级
java·数据库·后端·maven
程序员爱钓鱼2 小时前
Go 并发编程基础:通道(Channel)的使用
后端·google·go
FogLetter2 小时前
JavaScript 内存探秘:栈与堆的奇幻之旅
javascript·后端