【SpringBoot】过滤器Filter使用方式及遇到的不过滤路径问题

本文详细介绍了在SpringBoot中使用过滤器Filter的两种方法:@WebFilter注解配置与@Bean方式配置。解析了不当使用@Component导致过滤器不按预期工作的问题及解决方案,强调了@ServletComponentScan的作用。同时,提供了多个过滤器执行顺序设定的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在springboot中使用过滤器Filter有两种方式:
1、使用@WebFilter注解方式来配置。
2、在启动类中使用@Bean方式配置。

一、@WebFilter注解方式

@Component
@WebFilter(urlPatterns = "/test/list", filterName = "testFilter")
public class TestFilter implements Filter {
    ......
}

网上有说使用这种方法配置过滤器,自己试了一下,发起请求时确实进到过滤器里来了,但是并没有按照“/test/list”路径进行过滤,而是过滤了所有URL请求。在百度之后找到解决方案如下:

解决方法
首先,在上边TestFilter类上加@WebFilter注解是没错的,但是不要加@Component注解,然后在springboot的启动类上加上注解 @ServletComponentScan即可过滤指定路径。
原因
如果添加了@Component或@Configuration,又添加了@WebFilter(),那么会初始化两次Filter,并且会过滤所有路径+自己指定的路径 ,便会出现对没有指定的URL也会进行过滤的情况。

@ServletComponentScan注解的含义:在SpringBootApplication(启动类)上使用@ServletComponentScan注解后,Servlet、Filter(过滤器)、Listener(监听器)可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码!

二、@Bean注解方式

    @Bean
    public FilterRegistrationBean testFilterRegistration() {
    		FilterRegistrationBean registration = new FilterRegistrationBean(new TestFilter());
    		registration.addUrlPatterns("/test/list"); 
    		registration.setName("testFilter");
    		return registration;
    }

在启动类中写上上述代码即可。

当有多个过滤器时可以通过registration.setOrder(1); 来设定过滤器执行顺序。当指定order时,Filter的执行顺序和注册顺序是无关的。order数字越小,优先级越高!

	@Bean
	public FilterRegistrationBean testFilterRegistration() {
		FilterRegistrationBean registration = new FilterRegistrationBean(new TestFilter());
		registration.addUrlPatterns("/test/list"); 
		registration.setName("testFilter");
		
		registration.setOrder(1);
		return registration;
	}

参考博文:

https://blog.youkuaiyun.com/testcs_dn/article/details/80265196
https://blog.youkuaiyun.com/east123321/article/details/79694974

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值