Servlet过滤器是从Servlet2.3规范开始新增的功能,并在Servlet2.4规范中获得加强,监听器能够监听到Web应用程序启动和关闭。建立过滤器和监听器须要继承相应接口,并对其进行配置。java
过滤器web
在现实生活中,自来水都是通过一层层过滤处理才达到食用标准的,每一层过滤都起到一种净化的做用。JavaWeb中的Servlet过滤器与自来水被过滤的原理类似,Servlet过滤器主要用于对客户端(浏览器)的请求进行过滤处理,现将过滤后的请求转交给下一个资源,它在JavaWeb开发中具备十分重要的做用。浏览器
1 过滤器的定义服务器
Servlet过滤器与Servlet十分类似,但它具备拦截客户端(浏览器)请求的功能,Servlet过滤器能够改变请求中的内容来知足开发中的须要。对于程序开发人员而言,过滤器实质上就是在Web应用服务器上的一个Web应用组件,用于拦截客户端(浏览器)与目标资源的请求,并对这些请求进行必定过滤处理再发送给目标资源。过滤器的处理方式如图1所示。app
图1 过滤器工具
从上图能够看出,在Web服务器中部署了过滤器后,不只客户端发送的请求会通过过滤器的处理,并且请求在发送到目标资源处理之后,请求的回应信息也一样要通过过滤器。url
过滤器对象放置在javax.servlet包中,其名称为Filter,它是一个接口。除这个接口外,与过滤器相关的对象还有FilterConfig对象与FilterChain对象,这两个对象也一样是接口对象,位于javax.servlet包中,分别为过滤器的配置对象与过滤器的传递工具。在实际开发中,定义过滤器对象只须要直接或间接地实现Filter接口便可。xml
Filter接口:对象
每个过滤器对象都要直接或间接地实现Filter接口,在Filter接口中定义了3个方法,分别为init()方法,doFilter()方法和destroy()方法,其方法声明及说明以下:blog
● public void init(FilterConfig config)throws ServletException
过滤器初始化方法,该方法在过滤器初始化时调用
● public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)thrwos IOException,ServletException
对请求进行过滤处理
● public void destroy()
销毁方法,以便释放资源
FilterConfig接口:
FilterConfig接口有Servlet容器进行实现,主要用于获取过滤器中的配置信息,其方法声明及说明以下:
● public String getFilterName()
用于获取过滤器的名字
● public ServletContext getServletContext()
获取Servlet上下文
● public String getInitParameter(String name)
获取过滤器的初始化参数值
● public Enumeration getInitParameterNames()
获取过滤器的全部初始化参数
FilterChain接口:
FilterChain接口仍然由Servlet容器进行实现,在这个接口中只有一个方法,其方法声明以下:
punlic void doFilter(ServletRequest request,ServletResponse response)throws IOException, ServletException
该方法用于将过滤后的请求传递给下一个过滤器,若是此过滤器已是过滤器链中的最后一个过滤器,那么,请求将传送给目标资源。
2 过滤器实现步骤
建立一个过滤器对象须要实现javax.servlet.Filter接口,同时实现Filter接口的3个方法,下面的例子演示了过滤器的建立。
import java.io.IOException;
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 MyFilter implements Filter{
//初始化方法
public void init(FilterConfig fConfig)throws ServletException{
//初始化处理
}
public void doFilter(ServletRequest request,ServletResponse response,
FilterChain chain)throws IOException,ServletException{
//过滤处理
chain.doFilter(request,response);
}
public void destroy(){
//释放资源
}
}
过滤器中的init()方法用于对过滤器的初始化进行处理,destroy()方法是过滤器的销毁方法,用于释放资源,对于过滤处理的业务逻辑须要编写到doFilter()方法中,在请求过滤处理后,须要调用chain参数的doFilter()方法将请求向下传递给下一个过滤器或目标资源。
使用过滤器并不必定要将请求向下传递到下一个过滤器或目标资源,若是业务逻辑须要,也能够在过滤处理后,直接回应与客户端。
过滤器与Servlet十分类似,在建立以后一样须要对其在web.xml中进行配置,过滤器的配置主要分为两个步骤,分别为声明过滤器对象和建立过滤器映射。下面的代码演示过滤器的配置。
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.xdl.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/MyFilter</url-pattern>
</filter-mapping>
<filter>标签用于声明过滤器对象,在这个标签中必须配置两个子元素,分别为过滤器的名称与过滤器完整类名,其中<filter-name>用于定义过滤器的名称,<filter-class>用于指定过滤器的完整类名。
<filter-mapping>标签用于建立过滤器的映射,它的主要做用就是指定Web应用中,那些URL应用哪个过滤器进行处理。在<filter-mapping>标签中须要指定过滤器的名称与过滤器的URL映射,其中<filter-name>用于定义过滤器的名称,<url-pattern>用于指定过滤器应用的URL。
<filter>标签中的<filter-name>能够是自定义的名称,而<filter-mapping>标签中的<filter-name>是指定已经定义的过滤器的名称,它须要与<filter>标签中的<filter-name>一一对应。