Java Web中的Servlet过滤器与自来水被过滤的原理相似。
Servlet过滤器主要用于对客户端的请求进行过滤,并将过滤后的资源转交给下一资源。
1、什么是Servlet过滤器
如下图所示,Servlet过滤器具有拦截客户端请求的功能。
Servlet过滤器可以改变请求中的内容,来满足实际开发的需求。
不仅客户端发送的请求需要经过过滤器的处理,服务端返回的信息也需要经过过滤器。
当一个过滤器不足以解决实际业务需求时,就需要部署多个过滤器对业务请求进行处理,这就形成了一个过滤器链。
2、过滤器核心对象
2.1 Filter接口
每一个过滤器对象都需要直接或间接实现Filter接口。Filter对象实在doFilter方法中实现过滤操作的。
每一个Filter对象都有一个FilterConfig对象,通过FilterConfig对象Filter对象可以获取它的初始化参数。
每一个Filter对象也都有一个ServletContext的引用,通过这个引用,Filter对象可以加载它需要的资源。
在Filter接口中定义了三个方法,如下图所示。
2.2 FilterConfig接口
FilterConfig接口由Servlet容器进行实现,主要用于获取过滤器中的配置信息。
里面定义了四个方法。
2.3 FilterChain接口
Filter使用FilterChain调用过滤链中的一个Filetr(过滤器)。如果调用者是过滤链中的最后一个过滤器,那么就调用过滤链后的资源。
在FilterChain接口中只定义了一个方法。
3、过滤器的创建与实现
创建过滤器需要创建一个类实现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 filterConfig) throws ServletException{ } //过滤处理方法 public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain) throws IOException,ServletException{ } //销毁 public void destroy(){ } }
过滤器中的init()方法用于对过滤器的初始化进行处理。
destroy()方法是过滤器的销毁方法,主要用于释放资源,对于过滤处理的业务逻辑需要编写到doFilter()方法中。
在请求过滤处理后,需要调用chain参数的doFilter()方法将请求向下传递给下一过滤器或目标资源。
过滤器与Servlet十分相似,在创建之后同样需要对其进行配置。过滤器的配置主要分为两个步骤:
1、声明过滤器对象
2、创建过滤器映射
下面是上面创建的Filter的配置文件
<!-- 过滤器声明 --> <filter> <!-- 过滤器的名称 --> <filter-name>MyFilter</filter-name> <!-- 过滤器完整的类名 --> <filter-class>com.example.MyFilter</filter-class> </filter> <!-- 过滤器映射 --> <filter-mapping> <!-- 过滤器名称 --> <filter-name>MyFilter</filter-name> <!-- 过滤器URL映射 --> <url-pattern>/MyFilter</url-pattern> </filter-mapping>
<filter>标签用于表明过滤器对象,在这个标签中必须配置两个子元素,分别为过滤器的名称和过滤器完整类名。
其中<filter-name>用于定义过滤器的名称,<filter-class>用于指定过滤器的完整类名。
<filter-mapping>标签用于创建过滤器的映射,它的抓哟作用是指定Web应用中,哪些URL应用哪一个过滤器进行处理。
在<filter-mapping>中需要指定过滤器的名称和过滤器的URL映射。
其中<filter-name>用于定义过滤器的名称,<url-pattern>用于指定过滤器应用的URL。