springboot 定义filter主要有以下几种方式
- 注册使用FilterRegistrationBean(建议使用)
- 直接注册为spring bean(不能自定义属性,选择性使用)
- 注册使用DelegatingFilterProxyRegistrationBean(在使用托管场景下使用,比如:想修改通过2方式注册的filter的属性,2方式注册的filter将会失效,)
- 结合@ServletComponentScan使用注解@WebFilter注册(Servlet提供的注册方式,在spring boot工程里不建议使用)
- 自定义注册(基本不用,不推荐)
以上1,2,3的注册filter方式在类ServletContextInitializerBeans里可以查看
1:注册使用FilterRegistrationBean,这个是spring boot比较常用的方式
定义Filter
package com.zimu.filter;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class TestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
filterChain.doFilter(request, response);
}
}
注册成bean,FilterRegistrationBean里提供了一些属性设置,可根据需求进行设置
@Bean
public FilterRegistrationBean<TestFilter> testFilterFilterRegistrationBean() {
FilterRegistrationBean<TestFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new TestFilter()); //设置filter
registrationBean.addUrlPatterns("/*"); //设置拦截pattern
registrationBean.setOrder(0);//设置顺序
//......
return registrationBean;
}
2:直接注册为spring bean,该方式会使用默认属性,不能自定义属性,选择性使用
可以通过类上加@Component注解 或者 @Bean方式 将该filter注册为bean
package com.zimu.filter;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class TestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
filterChain.doFilter(request, response);
}
}
@Bean
public TestFilter testFilter() {
return new TestFilter();
}
3:注册使用DelegatingFilterProxyRegistrationBean(如果使用DelegatingFilterProxyRegistrationBean,则对应的filter通过方法2的注册将会失效,可以用作对filter的增强)
主要使用场景,1:bean的初始化顺序,例如spring security的filter因为有一系列的配置信息加载,所以初始化在DelegatingFilterProxyRegistrationBean 之后,所以达到了,先注册filter,后初始化filter的bean
2:用于修改jar里无法修改的通过bean注册的filter,利用了filter的注册优先级,使用DelegatingFilterProxyRegistrationBean,其对应的bean注册filter将会失效,具体实现在ServletContextInitializerBeans里
@Bean(name = "testFilter")
public TestFilter testFilter() {
return new TestFilter();
}
@Bean
public DelegatingFilterProxyRegistrationBean delegatingFilterProxyRegistrationBean() {
DelegatingFilterProxyRegistrationBean registrationBean = new DelegatingFilterProxyRegistrationBean("testFilter");
registrationBean.addUrlPatterns("/*"); //设置拦截pattern
registrationBean.setOrder(0);//设置顺序
//......
return registrationBean;
}
4:结合@ServletComponentScan使用注解@WebFilter注册,main方法上要加@ServletComponentScan注解
package com.zimu.filter;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter(urlPatterns = "/*")
public class TestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
filterChain.doFilter(request, response);
}
}
5:自定义注册(基本不用,不推荐)
该方法就是自己通过接口方式向servletContext里注册,基本不用,spring boot提供的方式足够使用