springboot 过滤器 总结

本文详细介绍了Spring框架中Web Filter的配置方法,包括如何通过注解实现过滤器的注册及注意事项,例如@ServletComponentScan与@WebFilter的使用,以及自定义过滤器的实现步骤。

filter:
1: 在启动类上加一个注解 @ServletComponentScan(basePackages=“需要扫描的过滤器”)
2: 新建myFilter 继承接口 Filter
3:在myFilter 上添加 @WebFilter(filterName=“过滤器名称” urlPatterns=“过滤规则” )
4:重写 三大方法 doFilter , init ,destroy

注意: 三个方法最好都重写一遍, 不要只重写 doFilter 方法。 在tomcat9.0一下版本部署可能失败。 因为有的tomcat内部父类组件 的三大方法有可能是普通方法。
详见:https://blog.youkuaiyun.com/ieen_csdn/article/details/86612492

注意: 在使用@WebFilter + @Order 时, Order是失效的。 过滤器执行顺序依然按照过滤器名称进行先后顺序的注册。

自定义过滤器类上注解可以使用的组合方式有:
@Component + @Order : 此时过滤器执行顺序排序是有效的, 但是过滤器不能指定拦截的url , 只能默认拦截全部
@WebFilter + @ServletComponentScan 此时 可以指定要拦截的url , 但是不能指定过滤器执行顺序
JavaConfig-FilterRegistrationBean(在启动类配置拦截器,此时自定义过滤器不加注解,为普通类即可) 可以指定过滤器要拦截的url 和 过滤器执行顺序, 但需要代码方式实现

注意: 过滤器中不能自动注入bean 对象。
因为过滤器执行顺序高于servlet , 在执行过滤器时bean对象还没有被实例化。
如果同时使用 @Component + @Order + @WebFilter + @ServletComponentScan , 同一个过滤器会被执行两次!

示例代码:
启动类:

@ServletComponentScan(basePackages = "com.diting.hb2.fastdevlop.commons.filter")

自定义过滤器:

@WebFilter(urlPatterns = "/*")
public class TestFilter01  implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("-----------执行过滤器01----------------");
        filterChain.doFilter(servletRequest ,servletResponse);
        System.out.println("-----------过滤器放行01----------------");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }
}
<think>好的,我需要回答用户关于Spring Boot过滤器的执行顺序和配置的问题。首先,我得回忆一下Spring Boot过滤器的工作原理和相关配置方法。 首先,过滤器在Servlet中的作用是处理HTTP请求和响应,执行一些预处理和后处理操作。在Spring Boot中,通常通过实现javax.servlet.Filter接口来创建自定义过滤器。然后,使用FilterRegistrationBean来注册过滤器并控制其执行顺序。 接下来,执行顺序方面,过滤器的顺序由order属性或@Order注解决定,数值越小优先级越高。但需要注意,使用FilterRegistrationBean注册时,order属性直接设置,而使用@Component和@Order注解的话,可能受自动配置的影响,顺序可能不如预期,所以最好显式注册。 配置过滤器的执行顺序,用户需要创建FilterRegistrationBean的实例,并设置Order值。例如,如果有多个过滤器,分别为它们设置不同的Order值,数值低的先执行。同时,可能需要使用@ServletComponentScan注解来扫描带有@WebFilter的过滤器类,或者直接在配置类中注册FilterRegistrationBean。 另外,用户可能想知道如何控制过滤器的URL匹配模式。在注册FilterRegistrationBean时,可以添加UrlPatterns来指定过滤器作用的URL路径,比如“/*”表示所有请求。 还需要提到可能的常见问题,比如多个过滤器之间的依赖关系,或者当使用第三方过滤器时如何调整顺序。例如,Spring Security的过滤器链通常有较高的优先级,用户自定义的过滤器需要根据需求调整顺序。 最后,引用相关的参考资料。根据用户提供的引用内容,可能引用到配置类相关的@Configuration注解和属性配置,比如引用[2]中的配置类示例,或者引用[3]中的请求映射配置,但这些可能与过滤器关系不大。不过用户提供的引用中有关于SpringApplicationBuilder和配置类的内容,可能可以关联到如何配置应用中的组件,包括过滤器。 总结步骤: 1. 创建自定义过滤器,实现Filter接口。 2. 使用FilterRegistrationBean注册过滤器,并设置Order属性。 3. 通过UrlPatterns指定过滤路径。 4. 处理多个过滤器的顺序问题,确保Order值正确。 5. 可能需要使用@ServletComponentScan或配置类来启用过滤器。 6. 注意自动配置的影响,最好显式注册过滤器以确保顺序正确。 可能还需要提到使用@WebFilter注解的情况,这时候可能需要结合@ServletComponentScan来扫描,并通过@Order指定顺序,但实际执行顺序可能还受其他因素影响,因此显式注册更可靠。 此外,可能涉及到Spring Boot自动配置的过滤器,比如CharacterEncodingFilter,它们的执行顺序如何调整。用户可能需要覆盖默认的过滤器顺序,这时候同样需要使用FilterRegistrationBean来调整。 最后,生成相关问题,比如如何控制过滤器的启用条件、如何排除某个过滤器,或者如何与Spring Security的过滤器链集成等。</think>### Spring Boot过滤器的执行顺序与配置方法 在Spring Boot中,过滤器(Filter)的执行顺序和配置主要依赖**注册方式**和**显式控制**。以下是具体实现方法: --- #### 1. 过滤器的执行顺序 - **默认顺序**:过滤器的执行顺序由注册时的`order`值决定,数值越小优先级越高。未显式指定时,顺序可能由类加载顺序决定,不可控[^2]。 - **注册方式影响**: - 使用`FilterRegistrationBean`注册时,通过`setOrder(int)`直接控制。 - 使用`@Component`+`@Order`注解时,可能因自动配置导致顺序不符合预期,**推荐显式注册**。 --- #### 2. 配置过滤器的步骤 ##### 2.1 创建自定义过滤器 ```java public class CustomFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { // 预处理逻辑 chain.doFilter(request, response); // 传递给下一个过滤器 // 后处理逻辑 } } ``` ##### 2.2 注册过滤器并设置顺序 在配置类中使用`FilterRegistrationBean`: ```java @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<CustomFilter> customFilterRegistration() { FilterRegistrationBean<CustomFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new CustomFilter()); registration.addUrlPatterns("/*"); // 匹配所有URL registration.setOrder(1); // 设置执行顺序 return registration; } // 注册其他过滤器并设置不同order值 } ``` ##### 2.3 使用`@WebFilter`注解(需配合扫描) ```java @WebFilter(urlPatterns = "/*") @Order(2) // 仅在配合@ServletComponentScan时可能生效 public class AnotherFilter implements Filter { // 实现逻辑 } ``` **启用扫描**: ```java @SpringBootApplication @ServletComponentScan // 扫描@WebFilter注解 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` --- #### 3. 关键注意事项 - **显式注册优于注解**:`FilterRegistrationBean`能更精确地控制顺序和URL匹配。 - **第三方过滤器的顺序**:例如Spring Security的过滤器链默认优先级较高(`Order=0`),需通过调整自定义过滤器的`order`值插入到合适位置。 - **URL匹配模式**:支持通配符(如`/api/*`),需根据业务需求设置。 --- #### 4. 示例:多个过滤器的执行顺序 假设定义两个过滤器: ```java // FilterA (order=1) public class FilterA implements Filter { /* ... */ } // FilterB (order=2) public class FilterB implements Filter { /* ... */ } ``` 执行顺序为:`FilterA → FilterB`(数值小的先执行)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值