Filter、Interceptor执行顺序

1.环境介绍

  配置两个Filter、两个Interceptor和一个测试Controller;内容如下

  

@Configuration
@WebFilter(filterName = "myFilter", urlPatterns = "/*")
public class MyFilter implements Filter {

@Override
 public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter-init1");
 }

@Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
//修改response
 HttpServletResponse response = (HttpServletResponse)servletResponse;

 byte[] data = "new data".getBytes();
 //通过length控制返回值长度,data的内容添加在原返回内容之前,控制data.length,则只返回data内容
 response.addHeader("Content-Length", "" + data.length);
 ServletOutputStream out = response.getOutputStream();
 out.write(data);
 out.flush();

 System.out.println("doFilter-before1");
 filterChain.doFilter(servletRequest, response);
 System.out.println("doFilter-after1");
 }

@Override
 public void destroy() {
System.out.println("Filter-destroy1");
 }
}
MyFilter
@Configuration
@WebFilter(filterName = "myFilter2", urlPatterns = "/*")
public class MyFilter2 implements Filter {

@Override
 public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter-init2");
 }

@Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
//修改response
 HttpServletResponse response = (HttpServletResponse)servletResponse;

 byte[] data = "new data".getBytes();
 //通过length控制返回值长度,data的内容添加在原返回内容之前,控制data.length,则只返回data内容
 response.addHeader("Content-Length", "" + data.length);
 ServletOutputStream out = response.getOutputStream();
 out.write(data);
 out.flush();

 System.out.println("doFilter-before2");
 filterChain.doFilter(servletRequest, response);
 System.out.println("doFilter-after2");
 }

@Override
 public void destroy() {
System.out.println("Filter-destroy2");
 }
}
MyFilter2
@Component
public class MyInterceptor extends HandlerInterceptorAdapter {

@Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("Interceptor-preHandle1");
 return super.preHandle(request, response, handler);
 }

@Override
 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
 ModelAndView modelAndView) throws Exception {
System.out.println("Interceptor-postHandle1");

 //和filter区别,是可以通过下面的代码拿到控制器及其方法
 HandlerMethod handlerMethod = (HandlerMethod) handler;
 handlerMethod.getMethodAnnotation(Autowired.class);

 super.postHandle(request, response, handler, modelAndView);
 }

@Override
 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("Interceptor-afterCompletion1");
 super.afterCompletion(request, response, handler, ex);
 }
}
MyInterceptor
@Component
public class MyInterceptor2 extends HandlerInterceptorAdapter {

@Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("Interceptor-preHandle2");
 return super.preHandle(request, response, handler);
 }

@Override
 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
 ModelAndView modelAndView) throws Exception {
System.out.println("Interceptor-postHandle2");

 //和filter区别,是可以通过下面的代码拿到控制器及其方法
 HandlerMethod handlerMethod = (HandlerMethod) handler;
 handlerMethod.getMethodAnnotation(Autowired.class);

 super.postHandle(request, response, handler, modelAndView);
 }

@Override
 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("Interceptor-afterCompletion2");
 super.afterCompletion(request, response, handler, ex);
 }
}
MyInterceptor2
@RestController
public class HealthCheckController {

    @GetMapping("health/check")
    public String healthCheck() {
        System.out.println("call controller");
        return "OK!!!";
    }
}
HealthCheckController

   

2.测试case

场景 输出                  备注
正常

doFilter-before1

doFilter-before2

Interceptor-preHandle1

Interceptor-preHandle2

call controller

Interceptor-postHandle2

Interceptor-postHandle1

Interceptor-afterCompletion2

Interceptor-afterCompletion1

doFilter-after2

doFilter-after1

 
在MyFilter类中不执行filterChain.doFilter(servletRequest, response);

doFilter-before1

doFilter-after1

Filter2、Interceptor和Controller都没有得到执行
MyInterceptor类的preHandle方法返回false

doFilter-before1

doFilter-before2

Interceptor-preHandle1

doFilter-after2

doFilter-after1

  • 后面的Interceptor执行不到

  • 当前Interceptor的postHandle和afterCompletion方法执行不到

  • Controller执行不到

 
 MyInterceptor类的preHandle方法抛出异常,例如int a =1/0;  

doFilter-before1

doFilter-before2

Interceptor-preHandle1

doFilter-after2

doFilter-after1

 效果和返回false相同
MyInterceptor类的postHandle方法抛出异常,例如int a =1/0;

doFilter-before1

doFilter-before2

Interceptor-preHandle1

Interceptor-preHandle2

call controller

Interceptor-postHandle2

Interceptor-postHandle1

Interceptor-afterCompletion2

Interceptor-afterCompletion1

doFilter-after2

doFilter-after1

 
MyInterceptor2类的postHandle方法抛出异常,例如int a =1/0;

doFilter-before1

doFilter-before2

Interceptor-preHandle1

Interceptor-preHandle2

call controller

Interceptor-postHandle2

Interceptor-afterCompletion2

Interceptor-afterCompletion1

doFilter-after2

doFilter-after1

 
posted @ 2022-03-06 23:25  Katsu  阅读(105)  评论(0编辑  收藏  举报