阻拦器装备:

  • SpringMVC中的阻拦器用于阻拦控制器办法的履行
  • SpringMVC中的阻拦器需求完成HandlerInterceptor或许承继HandlerInterceptorAdapter类
  • Spring的阻拦器必须在SpringMVC的装备文件中进行装备:

SpringMVC---拦截器
咱们经过源码剖析一下阻拦器的履行流程:

SpringMVC---拦截器
这三个办法是干什么的呢?

SpringMVC---拦截器

SpringMVC---拦截器
这里的handle其实便是咱们的controller控制器

SpringMVC---拦截器
咱们再进去看看这个processDispatchResult():

SpringMVC---拦截器

SpringMVC---拦截器

因此咱们知道了:阻拦器的三个重要办法分别在控制器履行之前,控制器履行之后,视图渲染之后。

创建阻拦器:

SpringMVC---拦截器

咱们自定义的阻拦器要完成HandlerInterceptor接口而且完成三个办法:

  • preHandle()
  • postHandle()
  • afterCompletion()

观察源码:preHandle()回来true时,阻拦器各个办法的履行次序:

阻拦器的三个抽象办法: SpringMVC中的阻拦器有三个抽象办法

  • preHandle:控制器办法履行之前履行preHandle(),其boolean类型的回来值表明是否阻拦或放行,回来true为放行,即调用控制器办法,假如为false就表明阻拦,就不调用控制器办法
  • postHandle:控制器办法履行之后履行postHandle()
  • afterCompletion:处理完视图和模型数据,渲染视图结束之后履行afterCompletion()

多个阻拦器的履行次序:
i.若每个阻拦器的preHandle()都回来true
此刻多个阻拦器的履行次序和阻拦器在SpringMVC的装备文件的装备次序有关:
preHandle()会依照装备的次序履行,而postHandle()和afterComplation()会依照装备的反序履行

ii.若某个阻拦器的preHandle()回来了false
preHandle()回来false和它之前的阻拦器的preHandle()都会履行,postHandle()都不履行,回来false的阻拦器之前的阻拦器的afterComplation()会履行

SpringMVC---拦截器
检查控制台:

SpringMVC---拦截器
确实是preHandle办法依照次序履行,而postHandle()和afterCompletion()依照逆序履行。
DeBUG检查源码:

SpringMVC---拦截器
因此这个mappedHandler是一个履行链,里面放的便是咱们的控制办法和处理器办法的阻拦器。

SpringMVC---拦截器
这里的this.interceptorIndex是当时阻拦器的上一个阻拦器的索引值

SpringMVC---拦截器

SpringMVC---拦截器

SpringMVC---拦截器

SpringMVC---拦截器

postHandle一个都不会履行,因为afterComletion是根据索引来履行,因此会回来阻拦器为false之前的阻拦器, 而preHandle会履行阻拦器为false及其之前的阻拦器。(假如不履行回来false的阻拦器,那么就不知道这个阻拦器是不是回来false)

上面便是阻拦器一些中心的履行次序源码了,期望可以帮到我们。