Servlets 简明教程

Servlets - Writing Filters

Servlet 过滤器是可以在 Servlet 编程中用于以下目的的 Java 类 −

  1. 在从客户端访问后端资源之前拦截请求。

  2. 在将响应从服务器发回客户端之前进行处理。

规范建议了多种类型的过滤器 −

  1. Authentication Filters.

  2. Data compression Filters.

  3. Encryption Filters.

  4. 触发资源访问事件的过滤器。

  5. Image Conversion Filters.

  6. Logging and Auditing Filters.

  7. MIME-TYPE Chain Filters.

  8. Tokenizing Filters .

  9. 转化 XML 内容的 XSL/T 过滤器。

过滤器部署在部署描述符文件 web.xml 中,然后映射到应用程序部署描述符中的 servlet 名称或 URL 模式。

当 Web 容器启动 Web 应用程序时,它将创建在部署描述符中声明的每个过滤器的实例。这些过滤器将按照在部署描述符中声明的顺序执行。

Servlet Filter Methods

过滤器只是一个实现了 javax.servlet.Filter 接口的 Java 类。javax.servlet.Filter 接口定义了如下三个方法 −

Sr.No.

Method & Description

1

public void doFilter (ServletRequest, ServletResponse, FilterChain) 当请求/响应对因客户端对链尾部的资源发出请求而通过链传递时,此方法由容器调用。

2

public void init(FilterConfig filterConfig) Web 容器调用此方法以向过滤器表示它正在被投入使用。

3

public void destroy() 当 Web 容器告知过滤器即将停用时,调用此方法。

Servlet Filter − Example

下面是 Servlet 过滤器示例,它将打印客户端的 IP 地址和当前日期时间。此示例将让您了解 Servlet 过滤器基础知识,但您可使用相同概念编写更复杂过滤器应用程序 −

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// Implements Filter class
public class LogFilter implements Filter  {
   public void  init(FilterConfig config) throws ServletException {

      // Get init parameter
      String testParam = config.getInitParameter("test-param");

      //Print the init parameter
      System.out.println("Test Param: " + testParam);
   }

   public void  doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws java.io.IOException, ServletException {

      // Get the IP address of client machine.
      String ipAddress = request.getRemoteAddr();

      // Log the IP address and current timestamp.
      System.out.println("IP "+ ipAddress + ", Time " + new Date().toString());

      // Pass request back down the filter chain
      chain.doFilter(request,response);
   }

   public void destroy( ) {
      /* Called before the Filter instance is removed from service by the web container*/
   }
}

按照通常方式编译 LogFilter.java ,并将类文件放在 <Tomcat-installationdirectory>/webapps/ROOT/WEB-INF/classes

Servlet Filter Mapping in Web.xml

过滤器经过定义并映射到 URL 或 Servlet,方式与将 Servlet 定义并映射到 URL 模式大致相同。在部署描述文件 web.xml 中创建过滤器标记以下条目

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

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

上述过滤器适用于所有 servlet,因为我们在配置中指定 / *。如果您只想对少数 servlet 应用过滤器,则可以指定特定 servlet 路径。

现在,尝试以惯常方式调用任何 servlet,您会在 Web 服务器日志中看到生成的日志。您可以使用 Log4J 记录器将上述日志记录到单独文件中。

Using Multiple Filters

您的 Web 应用程序可能针对特定目的定义多个不同的过滤器。假设您定义了两个过滤器 AuthenFilter 和 LogFilter。除了需要创建不同的映射外(如下所述),其余过程将保持上述说明 −

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

<filter>
   <filter-name>AuthenFilter</filter-name>
   <filter-class>AuthenFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

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

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

Filters Application Order

web.xml 中 filter-mapping 元素的顺序决定 Web 容器将过滤器应用于 servlet 的顺序。要逆转过滤器的顺序,您只需要逆转 web.xml 文件中的 filter-mapping 元素。

例如,上述示例将首先应用 LogFilter,然后将其应用任何 servlet,但以下示例将逆转顺序 −

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

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