今天调试Shiro源码时发现,即使我自己声明了 FilterRegistrationBean
导致shiro的 FilterRegistrationBean
无法生成,shiro仍然可以正常过滤请求。对此我百思不得其解,一番查阅后发现,spring好像有自动发现Filter的机制…………
在编写代码测试并打log后,发现原来Filter真的会自动生效。
代码:
@Bean
public Filter helloFilter() {
return new Filter() {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
LOGGER.info("helloFilter被触发!");
chain.doFilter(request, response);
}
};
}
日志:
2020-10-10 16:20:45.492 DEBUG 29672 --- [ main] o.s.b.w.s.ServletContextInitializerBeans : Mapping filters: filterRegistrationBean urls=[/*] order=2147483647, characterEncodingFilter urls=[/*] order=-2147483648, formContentFilter urls=[/*] order=-9900, requestContextFilter urls=[/*] order=-105, helloFilter urls=[/*] order=2147483647, shiroFilterFactoryBean urls=[/*] order=2147483647
注意看日志中的helloFilter,已经被成功注册,默认过滤 /*
。
经验
在Spring Web中,如果想要加入一个Filter,那么你只要保证这个Filter在IoC中就可以了,剩下的Spring会使用默认配置配置好的。
如果想要延迟生成,或者有其他原因要分离代码,也可以使用 FactoryBean
来生成Filter Bean。
如果要设置过滤路径,过滤级别这些自定义配置,可以使用 FilterRegistrationBean
来生成Filter Bean