拦截器配置:
- 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)
上面就是拦截器一些核心的执行顺序源码了,希望可以帮到大家。