Filter执行流程
图解:
客户端浏览器发送请求到指定的Servlet过程中, 通过Filter过滤器将请求拦截, 拦截之后就执行过滤器中重写的doFilter()方法, 一直执行到使用filterChain.doFilter()方法之后, 也就是放行之后, 我们的filterChain.doFilter()方法就是放行, 如果不放行, 则这个请求就会一直卡在过滤器中, 那么我们就永远都访问不到Servlet资源, 也就不会响应数据给客户端浏览器了, 所以客户端浏览器中就会显示一个空白的页面, 所以我们一定要使用FilterChain接口实现类的对象调用doFilter()方法进行放行
- 放行之后请求就到了服务器中, 也就是到了指定的Servlet中, 执行完指定的Servlet中的service()方法之后我们就要响应数据给客户端浏览器了, 这个时候响应数据的时候我们的响应的过程中也是会被对应的Filter过滤器再次拦截, 拦截之后就会执行放行之后的代码, 执行完放行之后的代码之后最终就会将我们的响应数据顺利的发送到客户端浏览器中
注意: Filter接口中的doFilter()方法和FilterChain接口中的doFilter()方法是不一样的, Filter接口中的doFilter()方法中有三个参数:
- ServletRequest
- ServletResponse
- FilterChain
而我们的FilterChain接口中的doFilter()方法中只有两个参数的:
- ServletRequest
- ServletResponse
补充:
放行之后会立刻访问对应的Servlet资源, 访问资源完成之后还是会回到对应的Filter中, 这其实是直接回到了上一次执行的doFilter()方法中, 上次我们执行完了chain.doFilter()方法之后就跳转去访问Servlet执行Servlet的service()方法了, 这个时候我们返回之后就是继续执行我们的doFilter()方法中的剩余的代码,也就是从放行之后开始执行
-
也就是: 执行放行前逻辑 ----> 放行 —> 访问Servlet资源, 执行Servlet中的service()方法 —> 执行放行后的逻辑 --> 最终就将响应数据发送到了客户端浏览器中
-
所以我们一般书写重写的Filter接口的doFilter()方法的时候就会将代码分为三部分:
- 放行前逻辑 : 对request数据进行处理
- 放行
- 放行后逻辑 : 对response数据进行处理
-
eg:
-
这里我们给出一个实例:
-
package com.ffyc.filter; import javax.servlet.*; import java.io.IOException; //注意: 这个时候导包的时候一定要注意, 有很多的Filter接口, 我们这个时候要实现的的javax.servlet包之下的Filter接口 //这个时候我们配置的拦截路径是"/*", 表示的意思是访问任何资源的时候都会被该过滤器进行拦截 public class FilterDemo2 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //不做实现 } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //放行前逻辑 System.out.println("放行前逻辑"); //放行 使用FilterChain接口实现类对象调用doFilter()方法 filterChain.doFilter(servletRequest, servletResponse); //放行后逻辑 System.out.println("放行后逻辑"); } @Override public void destroy() { //不做实现 } }
-