过滤器和拦截器

在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) :在响应返回给客户端时执行。
相关推荐
过客猫202239 分钟前
使用 deepseek实现 go语言,读取文本文件的功能,要求支持 ascii,utf-8 等多种格式自适应
开发语言·后端·golang
刘立军1 小时前
本地大模型编程实战(20)用langgraph和智能体实现RAG(Retrieval Augmented Generation,检索增强生成)(4)
人工智能·后端·llm
jingwang-cs1 小时前
内外网文件传输 安全、可控、便捷的跨网数据传输方案
人工智能·后端·安全
Aska_Lv2 小时前
Java8-Stream流-实际业务常用api案例
后端
Biehmltym3 小时前
【SpringMVC】概述 SSM:Spring + SpringMVC + Mybats
java·后端·spring
qw9493 小时前
SpringMVC
java·后端
customer083 小时前
【开源免费】基于SpringBoot+Vue.JS医疗报销系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
B站计算机毕业设计超人3 小时前
计算机毕业设计SpringBoot+Vue.jst房屋租赁系统(源码+LW文档+PPT+讲解)
vue.js·spring boot·后端·eclipse·intellij-idea·mybatis·课程设计
m0_748248654 小时前
SpringBoot整合easy-es
spring boot·后端·elasticsearch
一个热爱生活的普通人5 小时前
golang的切片(Slice)底层实现解析
后端·go