过滤器和拦截器

在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) :在响应返回给客户端时执行。
相关推荐
AI绘画哇哒哒3 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
唐青枫4 小时前
一个值多种形态:Zig union、Tagged Union 与内存布局实战
后端
卷无止境5 小时前
Windows 上丝滑开发 Python,并稳定构建 Docker 镜像
后端·python·docker
Nturmoils5 小时前
备份完不算完,先还原到临时库验一遍
后端
Csvn5 小时前
📊 SQL 入门 Day 22:视图与物化视图
后端·sql
Csvn5 小时前
🐍 Day 4: Python 控制流 — 条件、循环与推导式的艺术
后端·python
2601_953720826 小时前
【计算机毕业设计】基于Vue与Spring Boot的高校兼职信息服务平台设计与实现
spring boot·后端·课程设计
再吃一根胡萝卜7 小时前
用 Rust 写一个桌面悬浮图标:为什么它比 Python 更适合 AI 桌面工具?
后端
IT_陈寒8 小时前
Vue的computed属性把我坑惨了,原来我一直用错姿势
前端·人工智能·后端
evans在进步8 小时前
Spring Boot 核心机制详解:可执行 JAR、CORS、静态资源与配置绑定
spring boot·后端·jar