Servlet 编写过滤器


Servlet 编写过滤器

Servlet 过滤器是在 Web 应用程序的一次请求进入 Servlet 之前或者离开 Servlet 之后对请求或响应进行拦截和修改的组件。它们常常用于处理 Web 应用程序中的一些公共功能,如日志记录、编码、验证用户身份等。

本文将介绍如何编写 Servlet 过滤器。下面的例子演示了如何编写一个过滤器,用于记录所有 Web 请求的时间戳。

首先,我们需要实现 javax.servlet.Filter 接口,并覆盖其中的 doFilter() 方法。该方法可以接收三个参数:

  1. ServletRequest:代表客户端发出的请求。

  2. ServletResponse:代表要发送到客户端的响应。

  3. FilterChain:代表过滤器链,可以在其中调用下一个过滤器或 Servlet。

Filter 的 doFilter() 方法可以在请求前或请求后进行处理。为了记录请求的时间戳,我们在 doFilter() 方法中获取当前时间,并将它保存在请求的属性中。代码如下所示:

import java.io.IOException;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class TimeStampFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {
        // 这里可以进行一些初始化的操作
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 获取当前时间戳
        long startTime = System.currentTimeMillis();

        // 将时间戳保存在请求属性中
        request.setAttribute("startTime", new Date(startTime));

        // 调用下一个过滤器或 Servlet
        chain.doFilter(request, response);

        // 获取处理后的时间戳
        long endTime = System.currentTimeMillis();

        // 计算请求的处理时间
        long processingTime = endTime - startTime;

        // 输出请求的处理时间
        System.out.println("Request " + request.getAttribute("requestId") + " processed in " + processingTime + " ms");
    }

    public void destroy() {
        // 这里可以进行一些清理的操作
    }

}

在上述代码中,我们获取当前时间戳并将其保存在请求属性中。接着调用了下一个过滤器或 Servlet,并在请求处理完成之后获取结束时间戳,计算请求的处理时间并输出到控制台。

可以使用 FilterConfig 对象在过滤器初始化期间向过滤器传递任意数量的初始化参数。您可以使用 getInitParameter(name) 方法检索这些参数。在 init() 方法中,我们可以通过过滤器配置对象获取任意数量的初始化参数并将它们传递给其他方法。例如:

public void init(FilterConfig filterConfig) throws ServletException {
    String param1 = filterConfig.getInitParameter("param1");
    String param2 = filterConfig.getInitParameter("param2");
    // ...
}

最后,在 web.xml 文件中声明过滤器。例如:

<filter>
  <filter-name>TimeStampFilter</filter-name>
  <filter-class>com.example.TimeStampFilter</filter-class>
  <init-param>
    <param-name>param1</param-name>
    <param-value>value1</param-value>
  </init-param>
  <init-param>
    <param-name>param2</param-name>
    <param-value>value2</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>TimeStampFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

在上述示例中,我们可以看到如何声明一个过滤器和绑定到一个 URL 模式上。在 元素中,我们可以设置过滤器的初始化参数,这些参数可以在 FilterConfig 中访问。

到此,我们已经将一个过滤器集成到我们的应用程序中,并启用了请求时间戳记录。