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"); } }
@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"); } }
@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); } }
@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); } }
@RestController public class HealthCheckController { @GetMapping("health/check") public String healthCheck() { System.out.println("call controller"); return "OK!!!"; } }
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 |
|
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 |