Filter过滤器介绍
这里我们讲解Filter的执行流程,从下图可以大致了解到,当客户端发送请求的时候,会经过过滤器,然后才能到我们的servlet,当我们的servlet处理完请求之后,我们的response还是先经过过滤器才能到达我们的客户端,这里我们进行一个代码的演示,看看具体执行流程。首先给出一个图。
这里我们通过实现Filter接口,来进行定义过滤器类,通过注解来配置该过滤器拦截的路径。
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class FilterDemo2 implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 对request对象的请求进行处理
System.out.println("处理了request请求");
// 放行
chain.doFilter(request,response);
// 对response对象的响应进行处理
System.out.println("处理了response响应");
}
}
然后给出我们的index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
index.jsp...
<%
System.out.println("index.jsp...");
%>
</body>
</html>
可以看出,但我们客户端发起请求的时候,首先是经过了Filter过滤器,处理了request请求,然后去执行了我们的servlet/jsp,当执行完毕后,我们的response响应也经过了过滤器,这里经过过滤器的时候是从放行后面开始执行的,也就是处理了response响应(注意并没有再次处理request请求)。
多个Filter过滤器执行顺序
多个 Filter 过滤器执行的 特点:
- 所有 Filter 和目标资源都在同一个线程中
- 多个 Filter 共同执行的时候,都在使用同一个 Request 对象
- 多个 Filter 共同执行的时候,执行的先后顺序是由 web.html 配置文件中,从上到下的配置顺序决定的
- 只有执行到 filterChain.doFilter() 语句的时候,才会执行下一个 Filter 过滤器或者目标资源
Filter生命周期
Filter的生命周期可分为创建、执行、销毁三个阶段。
- 创建阶段:Web服务器启动的时候会创建Filter实例对象,并调用init()方法,完成对象的初始化。
- 执行阶段:当客户端请求目标资源时,服务器会筛选出符合映射条件的Filter,并按照类名的的先后顺序依次执行doFilter() 方法。
- 销毁阶段:服务器关闭时,Web服务器调用destroy()方法销毁Filter对象。