Servlet 过滤器作为组件 Spring Boot

Posted

技术标签:

【中文标题】Servlet 过滤器作为组件 Spring Boot【英文标题】:Servlet Filter as Component Spring Boot 【发布时间】:2016-10-19 19:17:22 【问题描述】:

我想在 Spring Boot Web 应用程序中配置 Servlet 过滤器,并且我想使用 @Value 注释自动装配一些 Bean 和属性。我能够使用以下配置来实现这一点:

   @Configuration
   public class MyWebConfig  
      @Autowire
      MyFilter filter;

      @Autowire
      MyAnotherFilter anotherFilter;  

      @Bean
      public FilterRegistrationBean someFilterRegistration() 
           FilterRegistrationBean registration = new  FilterRegistrationBean();
           registration.setFilter(filter);
           registration.setOrder(1);
           return registration;
      

      @Bean
      public FilterRegistrationBean someFilterRegistration() 
           FilterRegistrationBean registration = new  FilterRegistrationBean();
           registration.setFilter(anotherFilter);
           registration.setOrder(2);
           return registration;
      

    

并且我已经配置了两个过滤器(为简洁起见只显示一个过滤器):

@Configuration
public class MyFilter implements Filter

   @Value("$my.property.key")
   private String myProperty;

   public void doFilter(...)
        ....
   

   //init and destroy stubs  
        ....    
 

一切正常。我还有几个问题: 1) 即使我注释掉 FilterRegistrationBean 一段代码,它也能工作。如果我想设置某些顺序,我觉得我必须使用 FilterRegistrationBean。对吗? 2) 有没有什么方法可以在没有 FilterRegistrationBean 的情况下设置订单或其他配置,例如 url 模式? 3) 我相信我可以使用@Component 来替换Filter 类上的@Configuration 注解,它会正常工作吗? 4) 最后,将过滤器类本身标记为@Component/@Configuration 是否很好?

请注意,我在主应用程序类上使用 @SpringBootApplication。

【问题讨论】:

【参考方案1】:

1) 即使我注释掉 FilterRegistrationBean 一段代码,它也能正常工作。如果我想设置某些顺序,我觉得我必须使用 FilterRegistrationBean。对吗?

它之所以有效,是因为任何Filter bean 都会使用一些默认配置自动注册,除非您提供了显式注册 bean。

2) 有什么方法可以在没有 FilterRegistrationBean 的情况下设置订单或其他配置,例如 url 模式?

您可以通过在您的Filter 上使用@Order 或让它实现Ordered 来设置顺序。

如果你想设置 URL 模式,你应该使用注册 bean

3) 我相信我可以使用@Component 可以替换Filter 类上的@Configuration 注解并且它会正常工作?

正确。您的过滤器未配置,因此应使用 @Component 而不是 @Configuration 进行注释

4) 最后,将 Filter 类本身标记为 @Component/@Configuration 是否很好?

是的,可以使用@Component 注释过滤器。另一种方法是在@Configuration 类上使用@Bean 方法。

【讨论】:

以上是关于Servlet 过滤器作为组件 Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot配置过滤器的两种方式

Spring拦截器

整合Servlet到Spring容器

spring-boot 应用程序的外部配置

详解Spring mvc工作原理及源码分析

Spring Security:Servlet 过滤器