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