Analysis of Filter injection mode of Spring Boot filter

  • 2021-12-12 04:27:44
  • OfStack

Directory Filter Filter Injection Mode 1, 2, 3 Method 4 Injection of Custom Filter

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;
    }

Related articles: