在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.csdn.net/testcs_dn/article/details/80265196
https://blog.csdn.net/east123321/article/details/79694974

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐