Servlet(四) 过滤器
Servlet Filter是存在于Servlet程序中的一批类,用于以下目的:
- 在客户端请求访问后台资源之前对其进行拦截,并做指定处理
- 在结果反馈给客户端之前对其进行指定的处理
目前存在各类过滤器,如下所示:
- 鉴权过滤器
- 数据解/压缩过滤器
- 数据加/解密过滤器
- 触发资源访问事件的过滤器
- 图像转换过滤器
- 日志及审计过滤器
- MIME-TYPE链过滤器
- 令牌过滤器
- XML内容转换过滤器
过滤器通过web.xml进行发布,使用Servlet名字或URL模式进行映射。当Web容器启动时,它会为web.xml定义的每一个过滤器创建相应的实例,然后会依据web.xml过滤器的定义顺序依次调用,确切的讲,是依据<filter-mapping>的定义顺序。
过滤器的方法:
过滤器是实现了javax.servlet.Filter接口的类,该接口定义了三个方法:
-
public void doFilter (ServletRequest, ServletResponse, FilterChain)
每当有 请求/应答对经过过滤器链的前后末端时,web容器都会调用该方法,由于链中的过滤器是依据web.xml中定义的顺序进行排序的,所以请求会依次经过被12345过滤器进行处理,应答是依次被54321过滤器进行处理
-
public void init(FilterConfig filterConfig)
该方法被web容器调用,以标示当前过滤器已准备好提供相应的服务
-
public void destroy()
该方法被web容器调用,以标示当前过滤器已不再提供相应的服务
代码示例:
// 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*/ } }
上面的代码是一个日志过滤器类,实现了Filter接口,将其编译之后,通常放到web-inf下的classes目录下,然后修改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>
上面仅仅为一个过滤器,如果还有其它需要,当然还可以所上所示再添加其它功能的过滤器。
/***********************************************外星人乔丹拍板时间***********************************************/
既然是容器,那web容器会包容程序员编写的各类主要功能的代码,然后由容器负责调用,减轻程序员的编码工作量,降低代码的耦合度,过滤器就是一个
经典的例子,只需在web.xml中进行相应过滤链的配置,其它的事情,交给容器去处理