您现在的位置是:蓝石榴 > 个人博客 > Java

个人博客

Spring过滤器的targetFilterLifecycle作用

2015-08-01Java 6217
Spring过滤器在web.xml中进行配置,对URL请求进行过滤,链式处理。配置分为两种A和B。

Spring过滤器在web.xml中进行配置,对URL请求进行过滤,链式处理。配置分为两种A和B。

A:普通配置

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

<filter>

<filter-name>authFilter</filter-name>

<filter-class>com.lan16.weixin.filter.AuthFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>authFilter</filter-name>

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

</filter-mapping>

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

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

<filter>

<filter-name>authFilter</filter-name>

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

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

<init-param>

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

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

</init-param>

</filter>

<filter-mapping>

<filter-name>authFilter</filter-name>

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

</filter-mapping>

在springBean配置中加入:

<bean id="authFilter" class="com.lan16.weixin.filter.AuthFilter">

<property name="service" ref="service"/>

</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中的一样。此外,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!

很赞哦!(1342)