要在springboot中实现自定义filter的功能,首先要自己写一个filter,即定义一个类实现java.sevlet.Filter类的init、doFilter和destroy三个方法。

1.方法一: 使用spring的FilterRegistrationBean注册该filter即可,代码如下:

@Configuration
public class ApplicationConfiguration{
    @Bean
    public FilterRegistrationBean myFilter() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        MyFilter myFilter = new MyFilter();
        filterRegistrationBean.setFilter(myFilter);
        List<String> urls = new ArrayList<>();
        urls.add("/users/*");
        filterRegistrationBean.setUrlPatterns(urls);//配置过滤规则
        return filterRegistrationBean;
    }
}

Springboot通过注解实现的方式这里不再赘述,主要是通过@WebFilter注解实现。

2.方法二,借助spring的filter代理类DelegatingFilterProxy实现。

注: 什么是FactoryBean?为什么要使用FactoryBean创建bean?请参考另外一篇文章: Spring的FactoryBean。

代码如下:

@Configuration
public class ApplicationConfiguration{
    @Bean
    public FilterRegistrationBean myFilter() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new DelegatingFilterProxy("myFilter"));
        filterRegistration.addInitParameter("targetFilterLifecycle", "true");
		filterRegistration.setEnabled(true);
		filterRegistration.addUrlPatterns("/*");
        return filterRegistrationBean;
    }
}

如果是springboot中,还有一种合并起来的写法,代码如下:

@Configuration
public class ApplicationConfiguration{
	@Bean
    public DelegatingFilterProxyRegistrationBean delegatingFilterProxyRegistrationBean(){
        DelegatingFilterProxyRegistrationBean bean = new DelegatingFilterProxyRegistrationBean("myFilter");
        bean.addInitParameter("targetFilterLifecycle", "true");
        bean.setEnabled(true);
        bean.addUrlPatterns("/*");
        return bean;
    }
}

3.方法三,直接实例化自定义的Filter,但是这种Filter无法定义拦截规则,默认全局拦截,慎用。

第一种和第二种方法均实现了AbstractFilterRegistrationBean接口,而该接口间接实现了ServletContextInitializer,在springboot中启动容器后会查找实现该接口的bean,并调用onStartup()方法添加自定义的Filter。

两者的区别是方法二 DelegatingFilterProxyRegistrationBean 通过传入的proxyFilter名字,在WebApplicationContext查找该Fillter Bean,并通过DelegatingFilterProxy生成基于该Bean的代理Filter对象,而方法一FilterRegistrationBean 则是直接设置一个Filter,因此该Filter可以有spring容器管理,也可不用spring管理。

参考:https://www.jianshu.com/p/3d421fbce734

03-16 09:37