spring DelegatingFilterProxy,targetFilterLifecycle的作用

本文介绍了DelegatingFilterProxy的原理及其在Spring框架中的应用。该组件作为Servlet Filter的代理,能有效管理Filter的生命周期,并允许Filter注入Spring Bean。文章还详细解释了如何在web.xml中配置该组件,以及如何利用它来处理URL请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DelegatingFilterProxy的原理及使用

DelegatingFilterProxy就是一个对于servlet filter的代理,用这个类的好处主要是通过spring容器来管理servlet filter的生命周期,还有就是如果filter中需要一些Spring容器的实例,可以通过spring直接注入,另外读取一些配置文件这些便利的操作都可以通过Spring来配置实现。


targetFilterLifecycle的作用,有需要的朋友可以参考下。

在web.xml中进行配置,对所有的URL请求进行过滤,就像"击鼓传花"一样,链式处理。

配置分为两种A和B。

A:普通配置

在web.xml中增加如下内容:


<filter>

<filter-name>permissionFilter</filter-name>

<filter-class>com.taobao.riskm.filter.PermissionFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>permissionFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

由filter和filter-mapping构成。filter指定过滤器处理类(实现了Filter接口),filter-mapping指定过滤的规则。

B:高级配置(允许代理注入Spring bean)


在web.xml中增加如下内容:
<filter>

<filter-name>permission</filter-name>

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

<init-param>

<param-name>targetFilterLifecycle</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>permission</filter-name>

<url-pattern>*.htm</url-pattern>

</filter-mapping>

在spring bean配置中加入:

<bean id="permission" class="com.taobao.kfc.kwb.web.permission.PermissionHttpServlet"></bean>


因为filter比bean先加载,也就是spring会先加载filter指定的类到container中,这样filter中注入的spring bean就为null了。


解决办法:

先filter中加入DelegatingFilterProxy类,"targetFilterLifecycle"指明作用于filter的所有生命周期。

原理是,DelegatingFilterProxy类是一个代理类,所有的请求都会首先发到这个filter代理,然后再按照"filter-name"委派到spring中的这个bean。


在Spring中配置的bean的name要和web.xml中的<filter-name>一样.


此外,spring bean实现了Filter接口,但默认情况下,是由spring容器来管理其生命周期的(不是由tomcat这种服务器容器来管理)。如果设置"targetFilterLifecycle"为True,则spring来管理Filter.init()和Filter.destroy();若为false,则这两个方法失效!!


B和A最大的不同是,A是一个filter,优先被加载到container中,无法调用spring中后续的bean;而B是一个spring bean,可以引用其他的bean,而请求都通过DelegatingFilterProxy类委派给B!


B的另外一种配置方式:
<filter>

<filter-name>permission</filter-name>

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

<init-param>

<param-name>targetBeanName</param-name>

<param-value>Spring-bean-name</param-value>

</init-param>

</filter>


也就是增加一个"targetBeanName"的参数,值为实际执行Filter的bean。


注意:Filter和servlet都可以对URL进行处理,Filter是一个链式处理,只要你想继续处理就可以传递下去;而Servlet则是一次处理并返回!适合简单逻辑处理。


附录:

<url-pattern>可以选择以下几种形式



/* 所有资源

*.html 以html结尾的资源

/fold/* 指定目录

/abc.html 指定文件

以”/’开头和以”/*”结尾的是用来做路径映射的,

以前缀”*.”开头的是用来做扩展映射的。



为什么定义”/*.action”这样一个看起来很正常的匹配会错?

因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。



此外,filter就像"递归",在web.xml配置中的顺序代表了filter的调用流程,而servlet被调用后不会继续调用其他的servlet!因此配置中的顺序不影响!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你是我的天晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值