注册过滤器的两种方法都不相同,FilterRegistrationBean提供了排序选项。 DelegatingFilterProxy用作注册过滤器的代理,但是FilterRegistrationBean如何注册过滤器? 在servlet容器中注册两个过滤器之间有什么区别。
Spring Boot使用FilterRegistrationBean但不使用DelegatingFilterProxy为什么?
FilterRegistrationBean是否将过滤器直接添加为servlet过滤器,还是使用DelegatingFilterProxy之类的实现?
答案 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时,过滤器将与'/ *'相关联。如果未指定,则将推断出过滤器名称。”