过滤器可能是最强大的Web应用开发工具了!
与Servlet非常类似,过滤器就是Java组件,请求发送到Servlet之前,可以用过滤器截获和处理请求;另外Servlet结束工作之后,但在响应发回给客户之前,可以用过滤器处理响应。
过滤器要做的事情:
请求过滤器可以:
①完成安全检查
②重新格式化请求首部或体
③建立请求审计或日志
响应过滤器可以:
①压缩响应流
②追加或修改响应流
③创建一个完全不同的响应
过滤器和Servlet相似:1.容器管理过滤器的生命周期 2.容器知道过滤器API 3.都在DD中声明
每个过滤器都必须实现Filter接口,必须实现init()方法,实现doFilter()方法,实现destroy()方法。
1 package com.example.web; 2 3 import java.io.*; 4 import javax.servlet.*; 5 import javax.servlet.http.HttpServletRequest; 6 7 public class BeerRequestFilter implements Filter{ //实现Filter接口 8 private FilterConfig fc; 9 10 public void init(FilterConfig config) throws ServletException{ //实现init()方法 11 this.fc = config; 12 } 13 14 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException{ //实现doFilter()方法 这里参数是常规的ServletRequest和ServletResponse 15 HttpServletRequest httpReq = (HttpServletRequest)req; 16 String name = httpReq.setRemoteUser(); 17 if(null != name){ 18 fc.getServletContext().log("User " + name + " is updating"); 19 } 20 chain.doFilter(req, resp); //FilterChain接口的doFilter()方法,不同于Filter接口的doFilter()方法 21 } 22 23 public void destroy(){ //实现destroy()方法,但通常这个都为空 24 25 } 26 }
在DD中配置过滤器:
1 <filter> 2 <filter-name>BeerRequest</filter-name> 3 <filter-class>com.example.web.BeerRequestFilter</filter-class> 4 <init-param> //可选,可以有多个<init-param> 5 <param-name>LogFileName</param-name> 6 <param-value>UserLog.txt</param-value> 7 </init-param> 8 </filter> 9 10 <filter-mapping> //有两种<filter-mapping> 11 <filter-name>BeerRequest</filter-name> 12 <url-pattern>*.do</url-pattern> //声明对应URL模式的过滤器映射 13 </filter-mapping> 14 15 <filter-mapping> 16 <filter-name>BeerRequest</filter-name> 17 <servlet-name>AdviceServlet</servlet-name> //声明对应Servlet名的过滤器映射 18 </filter-mapping>
包装器:
Servlet API中的包装器类功能极其强大。
过滤器可以在Servlet之前先行处理请求,不过在Servlet生成响应之后,过滤器想再修改响应有些麻烦。这个时候可以使用包装器。