FilterRegistrationBean和DelegatingFilterProxy有什么区别?

时间:2019-05-06 07:04:25

标签: spring spring-boot spring-mvc servlet-filters

注册过滤器的两种方法都不相同,FilterRegistrationBean提供了排序选项。 DelegatingFilterProxy用作注册过滤器的代理,但是FilterRegistrationBean如何注册过滤器? 在servlet容器中注册两个过滤器之间有什么区别。

Spring Boot使用FilterRegistrationBean但不使用DelegatingFilterProxy为什么?

FilterRegistrationBean是否将过滤器直接添加为servlet过滤器,还是使用DelegatingFilterProxy之类的实现?

2 个答案:

答案 0 :(得分:1)

[DelegatingFilterProxy]用于在应用程序上下文中配置Filter,并以web.xml或替换形式进行URL映射。它将在ApplicationContext中查找过滤器并执行已配置的Filter。此类也是Spring Framework的一部分。它本身也是一个servlet Filter,因为它充当在Filter中配置的实际ApplicationContext实例的代理。

顾名思义,FilterRegistrationBean是用于提供配置以注册Filter实例的bean。它可以用来提供诸如URL映射之类的东西。它是Spring Boot使用的一个附加配置组件,因此它可以添加此Filter引用的FilterRegistrationBean可以注册为(或不注册为)。过滤链的一部分。

答案 1 :(得分:0)

FilterRegistrationBean是一个Spring Bean,可帮助您注册过滤器。

DelegatingFilterProxy本身就是一个过滤器。例如,可以使用FilterRegistrationBean将其注册到ServletContext中,如下所示:

@Bean
public FilterRegistrationBean filterChainRegistration() {
DelegatingFilterProxy filterProxy = new DelegatingFilterProxy();
filterProxy.setTargetBeanName(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
FilterRegistrationBean registrationBean = new FilterRegistrationBean(delegatingFilterProxy);
registrationBean.setName(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
 registrationBean.addUrlPatterns("/*");
return registrationBean;
}

编辑:

来自Spring Documentation:“一个ServletContextInitializer,用于在Servlet 3.0+容器中注册过滤器。类似于ServletContext提供的注册功能,但具有Spring Bean友好的设计。 必须在调用RegistrationBean.onStartup(ServletContext)之前指定Filter。注册可以与URL模式和/或servlet相关联(通过名称或通过ServletRegistrationBeans进行关联。当未指定URL模式或servlet时,过滤器将与'/ *'相关联。如果未指定,则将推断出过滤器名称。”