今天调试Shiro源码时发现,即使我自己声明了 FilterRegistrationBean 导致shiro的 FilterRegistrationBean 无法生成,shiro仍然可以正常过滤请求。对此我百思不得其解,一番查阅后发现,spring好像有自动发现Filter的机制…………
在编写代码测试并打log后,发现原来Filter真的会自动生效。
代码:

  1. @Bean
  2. public Filter helloFilter() {
  3. return new Filter() {
  4. @Override
  5. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  6. LOGGER.info("helloFilter被触发!");
  7. chain.doFilter(request, response);
  8. }
  9. };
  10. }

日志:

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