Analysis of Filter injection mode of Spring Boot filter
- 2021-12-12 04:27:44
- OfStack
Filter Filter injection mode
Type 1
@WebFilter(filterName = "myFilter",urlPatterns = "/*")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
}
@Override
public void destroy() {
}
}
@SpringBootApplication
@EnableAutoConfiguration
@EnableWebMvc
@ServletComponentScan(basePackages = "com.fanyin.eghm")
public class EghmApplication {
public static void main(String[] args) {
SpringApplication.run(EghmApplication.class, args);
}
}
The packet path scanned by @ ServletComponentScan must contain this Filter
Type 2
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new MyFilter2());
bean.addUrlPatterns("/*");
return bean;
}
}
Type 3
@Bean("proxyFilter")
public Filter filter (){
return new Filter() {
@Override
public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
}
@Override
public void destroy() {
}
};
}
@Bean
public DelegatingFilterProxyRegistrationBean delegatingFilterProxyRegistrationBean(){
DelegatingFilterProxyRegistrationBean bean = new DelegatingFilterProxyRegistrationBean("proxyFilter");
bean.addUrlPatterns("/*");
return bean;
}
Method 4
@Bean("myFilter")
public Filter filter (){
return new Filter() {
@Override
public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
}
@Override
public void destroy() {
}
};
}
Description:
The second type is similar to the third type, both of which implement AbstractFilterRegistrationBean interface, and this interface indirectly implements ServletContextInitializer. After starting the container, springboot will find bean that implements this interface, and call **onStartup () ** method to add a custom Filter. The difference between the two is that DelegatingFilterProxyRegistrationBean searches for Fillter Bean in WebApplicationContext through the incoming proxyFilter name, and generates proxy Filter object based on Bean through DelegatingFilterProxy.
For FilterRegistrationBean, one Filter is set directly, so the Filter can be managed by spring container or not by spring
Note: If Filter is declared as an Bean, it does not need to be defined as FilterRegistrationBean, but will be discovered and added by spring, that is, method 4, which cannot define interception rules, etc. It is global by default and should be used with caution!
Inject custom Filter
As a direct example, I now want to implement an Filter that filters all requests accessing the/admin prefix
public class AdminFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println(" Someone is visiting at this time admin");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println(" The person and the end of the visit ");
}
}
Although I customized an Filter here, it can't be scanned.
There are two ways to solve this, one is to increase the startup class
@ServletComponentScan
This annotation applies to both Filter and Servlet
Another way is to inject
FilterRegistrationBean
As follows:
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new AdminFilter());
filterRegistrationBean.addUrlPatterns("/admin/*");
return filterRegistrationBean;
}