Servlets 简明教程
Servlets - Writing Filters
Servlet 过滤器是可以在 Servlet 编程中用于以下目的的 Java 类 −
-
在从客户端访问后端资源之前拦截请求。
-
在将响应从服务器发回客户端之前进行处理。
规范建议了多种类型的过滤器 −
-
Authentication Filters.
-
Data compression Filters.
-
Encryption Filters.
-
触发资源访问事件的过滤器。
-
Image Conversion Filters.
-
Logging and Auditing Filters.
-
MIME-TYPE Chain Filters.
-
Tokenizing Filters .
-
转化 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>