过滤器是Servlet 2.3中定义的,可以对Servlet容器传给web组件的ServletRequest和ServletResponse对象进行检查和修改。过滤器本身不会产生ServletRequset和ServletResponse对象。可以为web组件提供一下功能:
1.在调用web组件之前检查ServletRequest对象,修改请求头和修改正文内容,或者对请求进行预处理操作。
2.在web组件被调用之后检查ServletResponse对象。修改响应头和响应正文。
过滤器的特点:
1.可以检查ServletRequest和ServletResponse对象,并利用ServletRequestWrapper和ServletResponseWrapper包装类来修改这两个对象。
2.可以在web文件中为过滤器映射特定的url。请求这些url时,servlet会先触发过滤器工作。
3.servlet2.3以上的版本都支持过滤器。
4.多个过滤器可以串联在一起,协同过滤请求对象和响应对象。
创建过滤器
所有的过滤器类都要实现javax.servlet.Filter接口。有三个必须实现的方法。
1.init(FilterConfig config)servlet容器创建FilterConfig对象,让后创建Filter对象,调用init(FilterConfig)方法.config可以读取web.xml中为配置的初始化参数。
2.doFilter(ServletRequest request,ServletResponse response,FilterChain chain)请求url和配置url相同时调用这个方法。用于访问后续过滤器或者web组件。
3.destroy()销毁对象调用。
过滤器的生命周期
1.初始化,web应用启动,servlet容器加载过滤器类,创建过滤器配置对象和过滤器对象。调用init方法。
2.运行时,只有过滤器映射url和请求url匹配时,调用doFilter方法。
3.销毁阶段,web应用终止时。servlet容器调用destroy方法,销毁对象。
发布过滤器
要在web.xml中加入Filter。
<filter>
<description></description>
<filter-name>名字</filter-name>
<filter-class>过滤器的class路径</filter-class>
<init-param>//参数可以有多个,可以用FilterConfig.getInitParameter(String name)来得到
<description></description>
<param-name></param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>跟上面的名字对应</filter-name>
<url-pattern>/*</url-pattern>/*为过滤所有
</filter-mapping>
串联过滤器
web.xml中一个请求url与多个过滤器匹配就可以串联。按顺序调用,先调用第一个过滤器的doFilter方法,然后执行chain.doFilter之前的方法,然后执行chain.doFilter,跳到第二个过滤器,在执行chain.filter之前的方法.同理一直到最后一个过滤器的chain.doFilter,调用servlet方法。结束后返回前一个过滤器,执行chain.doFilter之后的方法。
使用自定义的wrapper继承ServletRequestWrapper,修改里面的方法,把自定义的Wrapper传给chain.doFilter()中的request就可以修改request对象,同理也可以修改response响应内容。