javax.servlet.Filter接口定义了接口的生命周期,该接口定义了三个方法:
1 init(FilterConfig config) :容器加载filter的时候触发此方法,可以用来从web.xml文件收集初始化参数以及做些初始化操作。FilterConfig可用来获得初始化数据,此方法被调用一次且仅一次。
2 destroy():当Filter被从内存中unload的时候调用(最典型的是关闭应用的时候),该方法最好用来关闭Filter初始化的外部资源。
3 doFilter(ServletRequest request, ServletResponse response, FilterChain chain) :执行filter要完成的事情,HttpServlet情况下, ServletRequest和ServletResponse 对象是HttpServletRequest 和HttpServletResponse的实例。Filter 需要类型转换他们以便使用HttpServletRequest 和HttpServletResponse对象的方法。
FilterConfig 对象用来配置filter,FilterChain 对象用来表示filters链中当前应用到request和response中的filter。Filter 和Servlet的功能基本类似,唯一区别时候他强制分开链中的各个资源。可以说Filter是有额外功能的Servlet。FilterChain对象可以形象的理解为一种Stack,statck中的某个filter正在某个request和response上运行。FilterConfig 和ServletConfig 极为类似
默认情况filters链只能用来处理客户端发送的request,如果用RequestDispatcher 对象的forward() 或者include() 方法发送请求,filter是不能处理的,但是可通过配置web.xml处理:dispatcher元素中有REQUEST, INCLUDE, FORWARD, ERROR四种值可用来配置。
二 Wrapper
定制request或者response对象的时候,只需要简单的继承request或response的相应wrapper类(就是对request或response进行扩展实现)。sun公司提供四个方便的wrapper类:
ServletRequestWrapper
HttpServletRequestWrapper
ServletResponseWrapper
HttpServletResponseWrapper
wrapper类实际上使用了Decorator模式