过滤器API
由容器实现的接口
javax.servlet.Filter
javax.servlet.FilterChain
javax.servlet.FilterConfig
四个包装器类
javax.servlet.ServletRequestWrapper
javax.servlet.ServletResponseWrapper
javax.servlet.http.HttpServletRequestWrapper
javax.servlet.http.HttpServletResponseWrapper
Filter接口
Filter接口是过滤器API的核心
容器仅调用过滤器实例的init()方法一次。在init()方法没有执行完前,容器不会转发任何请求到过滤器
过滤器的生命周期方法 ,过滤器API不提供Filter接口的任何实现 。自定义的过滤器必须明确地实现所有三个方法
doFilter()方法给过滤器对象一个机会来处理请求,转发请求到过滤器链中的下一个组件,或者自己回复客户端
FilterConfig接口
为过滤器提供初始化参数 由Servlet容器实现
可以使用ServletContext与Web应用程序的其它组件一起共享application中的属性
配置Filter
< filter >元素
< filter >
< filter-name >ValidatorFilter< / filter-name >
< description>Validates the requests< / description >
< filter-class >com.lovobook.filters.ValidatorFilter< /filter-class >
< init-param >
< param-name>locale< /param-name>
< param-value>USA< /param-value>
< /init-param>
< /filter>
< filter-mapping >元素
< filter-mapping >
< filter-name >ValidatorFilter< /filter-name >
(所有匹配到该URL定义的请求,都要被filter-name中定义的过滤器过滤。)
< url-pattern >*.doc
< /filter-mapping >
< filter-mapping >
< filter-name >ValidatorFilter< /filter-name >
< servlet-name >reportServlet< /servlet-name >
(servlet-name用于定义一个servlet名,所有对该servlet的访问都要被filter-name中定义的过滤器过滤)
< /filter-mapping >
配置过滤器链
用多个过滤器处理在同一个请求
使用多个< filter-mapping >元素配置过滤器链
首先调用匹配请求URI的过滤器 < url-pattern >
再查找用Servlet名匹配请求URI的所有过滤器< servlet-name >
过滤器的顺序按照它们在部署描述文件中出现的顺序排序
< filter-mapping >
< filter-name>FilterA< / filter-name >
< servlet-name>RedServlet< / servlet-name >
< / filter-mapping >
< filter-mapping>
< filter-name>FilterB< / filter-name >
< url-pattern>*.red< / url-pattern >
< /filter-mapping>
< servlet-mapping>
< servlet-name>RedServlet< / servlet-name>
< url-pattern>*.red< / url-pattern>
容器会先调用匹配请求URI的过滤器,然后才是匹配servlet名的过滤器。因此,FilterB始终在FilterA之前调用