Servlet中的doFilter方法

开发 后端
本文介绍Servlet中的doFilter方法,以及介绍过滤器 API 包含 3 个简单的接口,它们整洁地嵌套在 javax.servlet 包中。

编写实现类的程序

过滤器 API 包含 3 个简单的接口,它们整洁地嵌套在 javax.servlet 包中。那 3 个接口分别是 Filter 、Filter Chain 和 Filter Config。从编程的角度看,过滤器类将实现 Filter  接口,然后使用这个过滤器类中的 Filter Chain 和 Filter Config 接口。该过滤器类的一个引用将传递给 Filter Chain 对象,以允许过滤器把控制权传递给链中的下一个资源。Filter Config 对象将由容器提供给过滤器,以允许访问该过滤器的初始化数据。

为了与我们的三步模式保持一致,过滤器必须运用三个方法,以便完全实现 Filter  接口:

init():这个方法在容器实例化过滤器时被调用,它主要设计用于使过滤器为处理做准备。该方法接受一个 Filter Config 类型的对象作为输入。

doFilter ():与 servlet 拥有一个 service() 方法(这个方法又调用 doPost() 或者 doGet())来处理请求一样,过滤器拥有单个用于处理请求和响应的方法——doFilter方法。这个方法接受三个输入参数:一个 Servlet Request、response 和一个 Filter Chain 对象。

destroy():正如您想像的那样,这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前进行。

清单 1 展示了一个非常简单的过滤器,它跟踪满足一个客户机的 Web 请求所花的大致时间。
清单 1. 一个过滤器类实现

  1. import javax.servlet.*;  
  2. import java.util.*;  
  3. import java.io.*;  
  4. public class TimeTrackFilter implements Filter {  
  5. private FilterConfig filterConfig = null;  
  6. public void init(FilterConfig filterConfig) throws ServletException {  
  7. this.filterConfig = filterConfig;  
  8. }  
  9. public void destroy() {  
  10. this.filterConfig = null;  
  11. }  
  12. public void doFilter( ServletRequest request, ServletResponse response, 
    FilterChain chain ) throws IOException, ServletException {  
  13. Date startTime, endTime;  
  14. double totalTime;  
  15. startTime = new Date(); // Forward the request to the next resource in 
    the chain chain.doFilter(request, wrapper);  
  16. // -- Process the response -- \\  
  17. // Calculate the difference between the start time and end time  
  18. endTime = new Date();  
  19. totalTime = endTime.getTime() - startTime.getTime();  
  20. totalTimetotalTime = totalTime / 1000; //Convert from milliseconds to 
    seconds StringWriter 
    sw = new StringWriter();  
  21. PrintWriter writer = new PrintWriter(sw);  
  22. writer.println();  
  23. writer.println("===============");  
  24. writer.println("Total elapsed time is: " + totalTime + " seconds." ); 
    writer.println("==============="); // Log the resulting string writer.flush(); 
    filterConfig.getServletContext(). log(sw.getBuffer().toString());  
  25. }  

这个过滤器的生命周期很简单,不管怎样,我们还是研究一下它吧:

初始化

当容器***次加载该过滤器时,init() 方法将被调用。该类在这个方法中包含了一个指向 Filter Config 对象的引用。我们的过滤器实际上并不需要这样做,因为其中没有使用初始化信息,这里只是出于演示的目的。

过滤

过滤器的大多数时间都消耗在这里。doFilter方法被容器调用,同时传入分别指向这个请求/响应链中的 Servlet Request、Servlet Response 和 Filter Chain 对象的引用。然后过滤器就有机会处理请求,将处理任务传递给链中的下一个资源(通过调用 Filter Chain 对象引用上的 doFilter方法),之后在处理控制权返回该过滤器时处理响应。

析构

容器紧跟在垃圾收集之前调用 destroy()方法,以便能够执行任何必需的清理代码。

【编辑推荐】

  1. Servlet容器的匹配过程
  2. 如何调用Servlet来处理请求
  3. 扩展Future Response Servlet
  4. 编写Servlet的三种方法
  5. Servlet容器中的事务
责任编辑:佚名 来源: 网界网
相关推荐

2009-07-09 11:21:40

Servlet注册

2009-07-06 13:18:35

Servlet方法

2009-07-07 16:23:05

Servlet容器

2009-07-09 14:32:39

2009-07-08 14:01:47

Servlet容器

2009-07-03 13:22:37

调用Servlet

2009-07-06 16:59:16

Servlet方法

2009-07-03 18:14:27

Servlet线程安全

2011-02-25 17:22:55

Servlet模块方法模式

2009-07-03 17:24:31

Servlet页面跳转

2009-07-09 16:57:03

Servlet与App

2009-07-10 11:07:00

WebWork注入Servlet方法

2013-09-02 09:18:59

2009-07-08 12:56:32

编写Servlet

2011-04-29 09:15:16

Servlet

2009-06-06 19:25:44

javaServlet基础结构

2010-05-11 16:22:40

2009-07-07 09:41:02

异步ServletAJAX

2009-07-07 11:18:59

JSP Servlet

2009-06-25 14:26:07

JSPJavaBeanServlet
点赞
收藏

51CTO技术栈公众号