DelegatingFilterProxy
使您可以将Spring Bean用作servlet过滤器。因此,您可以在过滤器内使用Spring上下文,注入其他Bean等。它扩展了GenericFilterBean
以获得此功能。GenericFilterBean
使您能够执行相同的操作。
这两个类似乎都声称最终提供了相同的功能。这两个类似乎都能够直接连接到web.xml
中。DelegatingFilterProxy
的代码似乎只是一层薄薄的间接。
但是,在您可以直接扩展GenericFilterBean
的情况下,为什么有必要这样做呢?例如,为什么Spring Security使用DelegatingFilterProxy
来调用FilterChainProxy
,尽管后者已经扩展了GenericFilterBean
?
1条答案
按热度按时间exdqitrt1#
它扩展了
GenericFilterBean
以获得此功能。我想我会换一种说法。根据
GenericFilterBean
的JavaDoc:另请注意
GenericFilterBean
的JavaDoc:或者,IOW,
GenericFilterBean
获取init-param
,将它们注册为Springbean属性,并将这些属性应用于过滤器。init-param
的容量有限,并且doFilter
仍然需要以任一方式实现。这就是
DelegatingFilterProxy
的用武之地。它从应用程序上下文中查找Filter
类型的bean,并在它自己的doFilter
方法中代理它。该代理允许应用程序指定Filter
类型的bean,该bean依赖于Spring的生命周期,而不是servlet容器的生命周期。您可以在
DelegatingFilterProxy
的JavaDoc中看到详细信息:FilterRegistrationBean
类型的Bean,以指定基础过滤器、其顺序和分派器类型。这两个类似乎都可以直接连接到
web.xml
是什么让您产生这种印象呢?鉴于
GenericFilterBean
是abstract
,我不清楚如何在web.xml
文件中引用它。Servlet容器将无法构造它。Spring Security是否使用
DelegatingFilterProxy
来调用FilterChainProxy
是的,我知道
Spring Security选择使用
Filter
API,而不是自己发明API。正因为如此,它非常符合DelegatingFilterProxy
的用途。(例如,您可以想象,如果人们只通过web.xml
init-param
来配置Spring Security,会受到多大的限制。)假设,如果Spring Security决定创建自己的类似过滤器的API,它将拥有自己的
GenericFilterBean
实现,该实现以不同的方式实现doFilter
。尽管后者已经扩展了
GenericFilterBean
我认为您的问题的这一部分是在问“既然
FilterChainProxy
实现了GenericFilterBean
,难道不能将其指定为servlet容器的过滤器吗?”答案是“不能”。DelegatingFilterProxy
的另一个好处是它允许延迟查找Filter
bean示例。这一点很重要,因为容器需要在启动之前注册Filter
示例。但是,Spring通常使用ContextLoaderListener
来加载Spring Bean,而这要等到需要注册Filter示例之后才能完成。那么,它为什么要扩展
GenericFilterBean
呢?大多数Spring过滤器都扩展了GenericFilterBean
,因为它允许应用程序更灵活地像构建块一样使用它们。就像它的JavaDoc所说的那样: