springMVC各个Filter的用法!

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

springMVC各个Filter的用法!_第1张图片

类的结构图如下:

springMVC各个Filter的用法!_第2张图片

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


GenericFilterBean类

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

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

  
  springCharacterEncodingFilter  
  org.springframework.web.filter.CharacterEncodingFilter  
    
     forceEncoding  
     true  
    
    
     encoding  
     UTF-8  
    
  
  
   springCharacterEncodingFilter  
   /*  
 
HiddenHttpMethodFilter

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

  
    HiddenHttpMethodFilter  
    org.springframework.web.filter.HiddenHttpMethodFilter  
      
        methodParam  
        _method_  
      
  
  
    HiddenHttpMethodFilter  
    /*  
  
在页面的form表单中设置method为Post,并添加一个如下的隐藏域:
 

HttpPutFormContentFilter

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

   
 

配置如下

  
   httpPutFormcontentFilter  
   org.springframework.web.filter.HttpPutFormContentFilter  
  
  
   httpPutFormContentFilter  
   /*  
 

RequestContextFilter

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


      org.springframework.web.context.ContextLoaderListener
  
    spring  
    org.springframework.web.servlet.DispatcherServlet  
      
        contextConfigLocation  
        classpath:dispatcher.xml  
      
  
  
    spring  
    /*  
  

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

   
    Acegi Filter Chain Proxy  
    org.acegisecurity.util.FilterToBeanProxy  
      
        targetBean  
        acegiFilterChainProxy  
      
  
  
    Acegi Filter Chain Proxy  
    Faces Servlet  
    FORWARD  
    REQUEST  
   
  
    RequestContextFilter  
    org.springframework.web.filter.RequestContextFilter  
  
  
    RequestContextFilter  
    Faces Servlet  
  

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接口。

  
   testFilter  
   org.springframework.web.filter.DelegatingFilterProxy  
     
      targetBeanName  
      spring-bean-name  
     
     
      contextAttribute  
     session  
     
     
      targetFilterLifecycle  
      false  
     
          
  
   testFilter  
   /*  
  
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类。




你可能感兴趣的:(框架)