/
开发web应用时,可以开发多个filter,
通过这些filter可以实现对一个或一组WEB资源进行访问拦截,
从而实现一些特殊的功能。
例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,
可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。
用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。
<dispatcher> 子元素可以设置的值及其意义:
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。
如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,
那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,
那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,
那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,
那么该过滤器将被调用。除此之外,过滤器不会被调用
和我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责
///?
当客户端每次访问filter拦截的资源时,Web容器针对每次访问请求,
都会调用一次filter对象的doFilter方法。
doFilter方法是filter接口中最重要的方法,
应用程序编程人员通常在这个方法内编写代码,体现拦截的目的
//
/
应用:
1.统一全站字符编码的过滤器
2.禁止浏览器缓存所有动态页面的过滤器:
response.setDateHeader("Expires",-1);
response.setHeader("Cache-Control","no-cache");?
response.setHeader("Pragma","no-cache");
3.控制浏览器缓存页面中的静态资源的过滤器
这个tomcat服务器已实现了,当这个页面第二次访问时,这些静态资源是不会再
往浏览器发这些数据,如js,css等静态资源
4.使用Filter实现URL级别的权限认证
这样可以对不同权限的用户进行过滤,他是否具有访问某些目录的权限
5.实现对request、response对象进行包装
使用Decorator模式包装request对象,实现html标签转义功能
使用Decorator模式包装response对象,响应内容的压缩功能
在自定义的response对象中,重写getOutputStream方法和getWriter方法,
使目标资源调用此方法输出页面内容时,
获得的是我们自定义的ServletOutputStream对象。
在我们自定义的ServletOuputStream对象中,重写write方法,
使写出的数据写出到一个buffer中。(ByteArrayOutputStream)
///缓存,压缩
当页面完成输出后,在filter中就可得到页面写出的数据,
从而我们可以调用GzipOuputStream对数据进行压缩后再写出给浏览器,
以此完成响应正文件压缩功能。