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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用