过滤器的理解

什么是过滤器, 过滤器不是servlet, 它是一个可以 传送请求 或者 修改响应 的对象, 它是 请求到达Servlet前的预处理程序, 以及响应离开Servlet后的后处理程序.

稍微具体点儿说, 过滤器可以:
1. 在一个servlet被调用前 截获 该调用
2. 在一个servlet被调用前 检查 请求
3. 修改 在实际请求中 提供的 请求对象的 请求头 和 请求数据
4. 修改 在实际响应中 提供的 响应对象的 响应头 和 响应数据
5. 在一个servlet被调用之后 截获该调用

一个过滤器 必须实现 java.servlet.filter 接口, 并定义它的三个方法:
1. void init(FilterConfig config) throws ServletException; 在过滤器执行过滤前调用, 设置过滤器的配置对象。

2. void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException, ServletException; 执行实际的过滤工作。

3. void destroy(); 在过滤器执行过滤后调用。

服务器先调用一次 init 方法为服务准备过滤器, 然后在请求需要使用过滤器的任何时候调用doFilter 方法。 FilterConfig接口检索过滤器名,初始化参数 以及Servlet上下文。

服务器调用 destroy 来指示过滤器已经完成过滤 。

在 doFilter 方法中,过滤器可以对请求对象和响应对象做它想做的一切 。过滤器 调用 chain.doFilter() 方法就将控制权传递给下一个过滤器了。不过还没完,精彩的来咯,在这个 调用返回后(整个过滤链的执行有点类似算法里面的先递推再回归),在 doFilter 方法的最后可以对 响应对象 做一些其他的事情。如果过滤器想终止请求的处理,或者想获得对响应的完全控制,就可以不调用下一个过滤器!

记录请求的持续时间:

public class TimeFilter implements Filter {
//保存在初始化时才能得到的FilterConfig对象的引用
//利用它可以检索过滤器名,配置参数,还有所处的Servlet上下文
private FilterConfig config = null;
public void init(FilterConfig config)throws ServletException{
this.config = config;
}

public void destroy() {
config = null; //释放对FilterConfig的引用,以便能被垃圾回收
}

public void doFilter(ServetRequest req,ServletResponse rep,FilterChain chain)throws IOException,ServletException {
long begin = System.currentTimeMillis();//请求到达的时间
chain.doFilter();
long end = System.currentTimeMillis();//响应离开Servlet的时间
String name = "";
if (req instanceof HttpServletRequest) {
name = ((HttpServletRequest)req).getRequestURI();
}
//私有的FilterConfig引用要派上用场了
config.getServletContext.log(name + " : " + (end - begin) + "ms");
}
}


然后在web.xml文件里面这样配置一下:
<filter>
<filter-name>timeFilter</filter>
<filter-class>TimeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>timeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

上面的配置使过滤器应用于所有对服务器的请求(静态和动态),正是我们需要的“计时过滤器”!如果我们连接一个简单的页面,可能的输出:
2006-10-21 11:53:00 /sprapp/index.html : 10ms

你可能感兴趣的:(过滤器的理解)