springMVC各个Filter的用法!

springMVC的filter位于 org.springframework.web.filter 包下

springMVC filter包括的类

类的结构图如下:


最顶层的GenericFilterBean、CompositeFilter无疑都实现了javax.servlet.filter接口,其子类都间接地实现了该接口。


GenericFilterBean类

GenericFilterBean是javax.servlet.Filter接口的一个基本的实现类,主要有init方法,获取web.xml的配置参数,保存到bean适配器。该类包含一个内部私有类,主要用于将web.xml中定义的init-param的值取出。它的子类要求实现doFilter()方法。

CharacterEncodingFilter 该过滤器是配置编码格式的,在web.xml中设置如下:

<filter>  
  <filter-name>springCharacterEncodingFilter</filter-name>  
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  <init-param>  
     <param-name>forceEncoding</param-name>  
     <param-value>true</param-value>  
  </init-param>  
  <init-param>  
     <param-name>encoding</param-name>  
     <param-value>UTF-8</param-value>  
  </init-param>  
</filter>  
<filter-mapping>  
   <filter-name>springCharacterEncodingFilter</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping> 
HiddenHttpMethodFilter

html中form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,spring3添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求。可以配置如下:

<filter>  
    <filter-name>HiddenHttpMethodFilter</filter-name>  
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>  
    <init-param>  
        <param-name>methodParam</param-name>  
        <param-value>_method_</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>HiddenHttpMethodFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>  
在页面的form表单中设置method为Post,并添加一个如下的隐藏域:
  <input type="hidden" name="_method" value="put" />

HttpPutFormContentFilter

HttpPutFormContentFilter过滤器的作用就是获取put表单的值,并将之传递到Controller中标注了method为RequestMethod.PUT的方法中。
与HiddenHttpMethodFilter不同,在form中不用添加参数名为_method的隐藏域,且method不必是post,直接写成put,但该过滤器只能接受enctype值为application/x-www-form-urlencoded的表单,也就是说,在使用该过滤器时,form表单的代码必须如下:
<form action="" method="put" enctype="application/x-www-form-urlencoded">    </form>  

配置如下

<filter>  
   <filter-name>httpPutFormcontentFilter</filter-name>  
   <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>  
</filter>  
<filter-mapping>  
   <filter-name>httpPutFormContentFilter</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping> 

RequestContextFilter

spring对页面的request进行转发,通常是通过设置LocaleContextHolder和RequestContextHolder

<listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener><pre name="code" class="html"><servlet>  
    <servlet-name>spring</servlet-name>  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    <init-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>classpath:dispatcher.xml</param-value>  
    </init-param>  
</servlet>  
<servlet-mapping>  
    <servlet-name>spring</servlet-name>  
    <url-pattern>/*</url-pattern>  
</servlet-mapping>  

 在web.xml中配置RequestContextFilter,这种方式通常是用于配置第三方servlet,如jsf时,配置代码如下所示: 

 <filter>  
    <filter-name>Acegi Filter Chain Proxy</filter-name>  
    <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>  
    <init-param>  
        <param-name>targetBean</param-name>  
        <param-value>acegiFilterChainProxy</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>Acegi Filter Chain Proxy</filter-name>  
    <servlet-name>Faces Servlet</servlet-name>  
    <dispatcher>FORWARD</dispatcher>  
    <dispatcher>REQUEST</dispatcher>  
</filter-mapping>   
<filter>  
    <filter-name>RequestContextFilter</filter-name>  
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>RequestContextFilter</filter-name>  
    <servlet-name>Faces Servlet</servlet-name>  
</filter-mapping>  

DelegatingFilterProxy

该类其实并不能说是一个过滤器,它的原型是FilterToBeanProxy,即将Filter作为spring的bean,由spring来管理。该类提供了在web.xml和application context之间的联系。

有以下几个参数可以设置:
(1) contextAttribute,使用委派Bean的范围,其值必须从org.springframework.context.ApplicationContext.WebApplicationContext中取得,默认值是session;其他可选的有request、globalSession和application
(2) targetFilterLifecycle,是否调用Filter的init和destroy方法,默认为false。
(3)targetBeanName,被代理的过滤器的bean的名字,该bean的类必须实现Filter接口。

<filter>  
   <filter-name>testFilter</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>  
   <init-param>  
      <param-name>contextAttribute</param-name>  
     <param-value>session</param-value>  
   </init-param>  
   <init-param>  
      <param-name>targetFilterLifecycle</param-name>  
      <param-value>false</param-value>  
   </init-param>  
</filter>          
<filter-mapping>  
   <filter-name>testFilter</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping>  
testFilter是spring容器管理的对象,对象实现了filter接口,将 Servlet中的filters和spring容器中的Bean和关联起来,方便spring进行管理
如果不配置DelegatingFilterProxy,则由于filter比bean先加载,也就是spring会先加载filter指定的类到container中,这样filter中注入的spring bean就为null了。如果将filter中加入DelegatingFilterProxy类,"targetFilterLifecycle"指明作用于filter的所有生命周期。原理是,DelegatingFilterProxy类是一个代理类,所有的请求都会首先发到这个filter代理,然后再按照"filter-name"委派到spring中的这个bean。

spring bean实现了Filter接口,但默认情况下,是由spring容器来管理其生命周期的(不是由tomcat这种服务器容器来管理)。如果设置"targetFilterLifecycle"为True,则spring来管理Filter.init()和Filter.destroy();若为false,则这两个方法失效。
在Spring Security中就是使用该类进行设置。即在web.xml中配置该过滤器,然后在spring security相关的配置中设置相应的过滤器bean。但是该类是spring-web包下的类,不属于Spring Security类。




  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值