Spring MVC的DelegatingFilterProxy有什么意义?

我在我的Spring MVC应用程序的web.xml看到了这一点:

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

我试图弄清楚它为什么存在以及是否真的需要它。

我在Spring文档中找到了这个解释,但它并没有帮助我理解它:

似乎表明这个组件是web.xml定义的servlet和Spring applicationContext.xml定义的组件之间的“粘合剂”。

7.1 DelegatingFilterProxy

当使用servlet过滤器时,显然需要在web.xml声明它们,否则它们将被servlet容器忽略。 在Spring Security中,过滤器类也是在应用程序上下文中定义的Spring bean,因此可以利用Spring丰富的依赖注入工具和生命周期接口。 Spring的DelegatingFilterProxy提供了web.xml和应用程序上下文之间的链接。

当使用DelegatingFilterProxy时,你会在web.xml文件中看到类似下面的内容:

<filter>
  <filter-name>myFilter</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
  <filter-name>myFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

请注意,过滤器实际上是一个DelegatingFilterProxy ,而不是实际实现过滤器逻辑的类。 DelegatingFilterProxy所做的是将Filter的方法委托给从Spring应用程序上下文获得的bean。 这使得bean可以从Spring Web应用程序上下文生命周期支持和配置灵活性中受益。 该bean必须实现javax.servlet.Filter并且它的名称必须与filter-name元素中的名称相同。 阅读Javadoc的DelegatingFilterProxy以获取更多信息

所以,如果我从web.xml取出这个,会发生什么? 我的servlets将无法与Spring容器通信?**


这里有一些神奇的东西,但最后,一切都是确定性的程序。

DelegatingFilterProxy是一个如上所述的过滤器,其目标是“ 委托给一个实现了Filter接口的Spring管理bean ”,也就是说,它在你的Spring应用程序中找到一个bean(“target bean”或“delegate”)上下文并调用它。 这怎么可能? 因为这个bean实现了javax.servlet.Filter,所以它的doFilter方法被调用。

哪个bean被调用? DelegatingFilterProxy“支持”targetBeanName“[...],在Spring应用程序上下文中指定目标bean的名称。”

正如你在web.xml中看到的那个bean的名字是“springSecurityFilterChain”

因此,在Web应用程序的上下文中,Filter会在您的应用程序上下文中实例化一个名为“springSecurityFilterChain”的bean,然后通过doFilter()方法将其委托给它。

请记住,您的应用程序上下文是使用所有应用程序 - 上下文(XML)文件定义的。 例如:applicationContext.xml和applicationContext-security.xml。

所以试着在后面找到一个名为“springSecurityFilterChain”的bean ...

...并且可能你不能 (例如,如果你遵循教程或者如果你使用Roo配置安全性)

这是神奇的: 配置安全性有一个新的元素 ,就像

<http auto-config="true" use-expressions="true"> 

因为它是http://www.springframework.org/schema/security/spring-security-3.0.xsd允许的,将会有所斩获。

当Spring使用XML文件加载应用程序上下文时,如果它找到一个元素,它将尝试设置HTTP安全性,即过滤器堆栈和受保护的URL,并注册名为“springSecurityFilterChain”的FilterChainProxy。

或者,您可以用经典的方式定义bean,即:

<beans:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">

但是不太推荐,因为你需要做很多配置(你要使用的所有过滤器,而且有十多个)


你知道什么是Servlet过滤器,它是如何工作的? 这是Servlet规范中非常有用的一部分,允许我们将类AOP概念应用于HTTP请求服务。 许多框架都使用Filter实现各种各样的东西,并且找到它们的自定义实现并不罕见,因为它们非常易于编写和使用。 在Spring应用程序中,您的应用程序可以执行的大部分工作都是在您的Spring bean中。 但是,Filter实例受servlet容器控制。 容器实例化,初始化并销毁它。 然而,Servlet Spec并不需要任何类型的Spring集成,所以你只剩下一个非常有用的概念(Filters),没有方便的方法将它绑定到你的Spring应用程序和执行工作的bean。

输入DelegatingFilterProxy。 您编写一个Filter实现并将其设为Spring bean,但不是将自己的Filter类添加到web.xml中,而是使用DelegatingFilterProxy,并在Spring上下文中为其指定过滤器的bean名称。 (如果你没有明确提供一个名称,它使用“filter-name”)。然后在运行时,DelegatingFilterProxy处理找到真正实现的复杂性 - 你在Spring中编写和配置的实现 - 并将请求路由到它。 所以在运行时,就好像你已经在web.xml中列出了你的过滤器,但是你可以像其他任何Spring bean一样获得线程的好处。

如果你把这个过滤器映射到你的web.xml中,所有东西都会继续工作,但是你的URL都不会被保护。 (假设名字“springSecurityFilterChain”准确地描述了它的作用)。这是因为这个映射过滤了每个传入的请求,并将它传递给在你的spring上下文中定义的安全过滤器。


什么是Servlet过滤器?

通常,Servlet过滤器是一种Java WebApp概念。 无论您是否在应用程序中使用Spring框架,您都可以在任何webapp中使用servlet筛选器。

这些过滤器可以在请求到达目标servlet之前拦截请求。 您可以在servlet过滤器中实现通用功能,如授权。 一旦实现,您可以在web.xml中配置过滤器以应用于特定的servlet,特定的请求url模式或所有url模式。

在哪里使用servlet过滤器?

现代的网络应用程序可以有几十个这样的过滤器。 像授权,缓存,ORM会话管理和依赖注入等事情通常借助于servlet过滤器来实现。 所有这些过滤器都需要在web.xml注册。

实例化Servlet过滤器 - 无需Spring框架

您的servlet容器创建了web.xml声明的过滤器的实例,并在适当的时候调用它们(即,在服务servlet请求时)。 现在,如果你像绝大多数依赖注入(DI)粉丝那样,你可能会说创建实例就是我的DI框架(Spring)做得更好。 我无法获得用Spring创建的servlet过滤器,因此它们适用于所有DI善良?

DelegatingFilterProxy ,以便Spring创建您的过滤器实例

这是DelegatingFilterProxy英寸步骤DelegatingFilterProxy是一个impelmentation javax.servlet.Filter由Spring框架提供的接口。 一旦在web.xml中配置了DelegatingFilterProxy ,就可以声明在Spring配置中进行筛选的实际Bean 。 这样,Spring将创建实际过滤的bean实例,并且您可以使用DI来配置这些bean。

请注意,在web.xml只需要一个DelegatingFilterProxy声明,但是您可以在应用程序上下文中将几个过滤bean链接在一起。

链接地址: http://www.djcxy.com/p/7667.html

上一篇: What's the point of Spring MVC's DelegatingFilterProxy?

下一篇: Chosing a right framework