要在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