什么是FilterChain
再Web应用中部署多个Filter
,拦截同一目标资源,组成Filter
链(过滤器链)
特点:
-
滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到传递给目标资源。
FilterChain接口
-
容器将其实例对象作为参数传入 Filter 对象的 doFilter() 方法中。
-
Filter 对象可以使用 FilterChain 对象调用链中下一个 Filter 的 doFilter() 方法
-
若该 Filter 是链中最后一个过滤器,则调用目标资源的 service() 方法。FilterChain 接口中只有一个方法
返回值类型 | 方法 | 描述 |
---|---|---|
void | doFilter(ServletRequest request ,ServletResponse response) | 使用该方法可以调用过滤器链中的下一个 Filter 的 doFilter() 方法,若该 Filter 是链中最后一个过滤器,则调用目标资源的 service() 方法。 |
注意:
-
Filter.doFilter()
方法中调用FilterChain.doFilter()
方法的语句前后增加某些程序代码,就可以实现例如权限控制、过滤敏感词、设置统一编码格式等功能。
Filter链拦截过程
注意:
-
过滤器并不是必须要将请求传递到下一个过滤器或目标资源,它可以自行对请求进行处理,并发送响应给客户端,也可以将请求转发给其他的目标资源。--->也就是说任意一个Filter都可以返回响应结果
-
过滤器链中的任何一个 Filter 没有调用 FilterChain.doFilter() 方法,请求都不会到达目标资源。
Filter链Filter的执行顺序
web.xml
@WebFilter注解
<filter-mapping>
靠前,则 Filter 先执行,靠后则后执行。
第一个过滤器类:
package com.example.HttpServletRequestDemo;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 模拟过滤链的过滤器
* @since JDK 1.8
* @date 2021/09/20
* @author Lucifer
*/
public class FirstChainFilter implements Filter {
//设置无参构造器
public FirstChainFilter(){}
//销毁对象方法
第二个过滤器类:
package com.example.HttpServletRequestDemo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 二次访问Servlet的类
* @since JDK 1.8
* @date 2021/09/20
* @author Lucifer
*/