spri!gMVC各个Filter的用法!

来源:互联网 发布:人工智能系统 编辑:程序博客网 时间:2024/06/05 13:20

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 0