Spring过滤器的targetFilterLifecycle作用


   作者蓝石榴    由lan16转载自蓝石榴    更新于2015-08-01 10:34    已被浏览466次

  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:高级配置(允许代理注入Spring Bean)
  在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>

  在spring Bean配置中加入:
  <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!