SpringMVC各个拦截器执行顺序源码分析

453 阅读1分钟

先配置两个拦截器(1在上,2在下)

1.每个拦截器的preHandle()都返回true

image.png

image.png 运行结果:

image.png
分析:

打上断点

image.png

image.png

调试

进入此方法

image.png 方法体:

image.png

该方法遍历拦截器

image.png 由于拦截器中preHandle()方法返回的都是true,不会执行if语句的内容,但会按顺序执行if条件判断,也就是interceptor.preHandle(request, response, this.handler),按顺序输出。
进入下一个断点:

image.png 可以发现,i从2开始往前遍历,也就是说,interceptor.postHandle方法先2后1,

进入最后一个断点:

image.png 分析可知,由于preHandle()方法返回的都是true,interceptorIndex执行了赋值(参考第一个方法的方法体),所以该方法从i=1往前遍历,仍然是先2后1。所以最后控制台输出结果为:

image.png

某个拦截器的preHandle()返回了false

通过对源码的分析,若preHandle()返回了false,

,则直接执行return语句,后续语句不会执行,即post方法不会执行 image.png

,进入该语句发现 image.png 说明虽然post语句不会执行,但AfterCompletion会执行(由于返回flase的i不会进行赋值,所以只执行了第一个拦截器的AfterCompletion方法)。
最终输出结果为:

image.png

总结

a>若每个拦截器的preHandle()都返回true:
此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关: preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()会按照配置的反序执行
b>若某个拦截器的preHandle()返回了false:
preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false 的拦截器之前的拦截器的afterComplation()会执行