过滤器

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。

原文地址:https://www.cnblogs.com/cuglkb/p/6670984.html