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