阻拦器装备:
- SpringMVC中的阻拦器用于阻拦控制器办法的履行
- SpringMVC中的阻拦器需求完成HandlerInterceptor或许承继HandlerInterceptorAdapter类
- Spring的阻拦器必须在SpringMVC的装备文件中进行装备:
咱们经过源码剖析一下阻拦器的履行流程:
这三个办法是干什么的呢?
这里的handle其实便是咱们的controller控制器
咱们再进去看看这个processDispatchResult():
因此咱们知道了:阻拦器的三个重要办法分别在控制器履行之前,控制器履行之后,视图渲染之后。
创建阻拦器:
咱们自定义的阻拦器要完成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()会履行
检查控制台:
确实是preHandle办法依照次序履行,而postHandle()和afterCompletion()依照逆序履行。
DeBUG检查源码:
因此这个mappedHandler是一个履行链,里面放的便是咱们的控制办法和处理器办法的阻拦器。
这里的this.interceptorIndex是当时阻拦器的上一个阻拦器的索引值
postHandle一个都不会履行,因为afterComletion是根据索引来履行,因此会回来阻拦器为false之前的阻拦器, 而preHandle会履行阻拦器为false及其之前的阻拦器。(假如不履行回来false的阻拦器,那么就不知道这个阻拦器是不是回来false)
上面便是阻拦器一些中心的履行次序源码了,期望可以帮到我们。