在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

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐