DispatcherServlet做为SpringMVC前置处理器,在doDispatch方法中定义了模块整体的核心流程,SpringMVC独有的拦截器的执行逻辑同样也定义在其中,关于SpringMVC的整体流程逻辑原理解析可参考文章:Spring MVC原理解析
如下图所示,标注了拦截器执行的关键步骤:
第一步:从处理器映射器中获取HandlerExecutionChian,该类包含一个处理器Handler和一个HandlerInterceptor列表;
第二步:调用拦截器中preHandle方法,拦截器中定义了三个方法,这个方法返回的是boolean类型,其它两个方法返回的是void方法,这个方法返回的true或false会影响拦截器执行顺序,当返回true,会接着执行下一个拦截器的preHandle方法,如果放回false,则从上一个拦截器开始倒序执行拦截器的afterCompletion方法,最后整个doDispatcher执行就结束了;
第三步:能到第三步的前提是,拦截器的preHandle方法都返回true,这种情况下,在第二步依次正序执行每个拦截器的preHandle方法后,然后在第三步依次倒序执行每个拦截器的postHandle方法,接着到第四步;
第四步:依次倒序执行每个浏览器的afterCompletion方法,至此拦截器流程就执行完了。
验证:定义两个拦截器Interceptor1和Interceptor2
preHandle方法都返回true,执行结果如下:
第二个拦截器preHandle方法返回false,执行结果如下: