- 关于执行顺序
com.atguigu.springmvc.interceptors.FirstHandlerInterceptor – preHandle com.atguigu.springmvc.interceptors.SecondHandlerInterceptor – preHandle ************************************biz method******************************* com.atguigu.springmvc.interceptors.SecondHandlerInterceptor – postHandle com.atguigu.springmvc.interceptors.FirstHandlerInterceptor – postHandle com.atguigu.springmvc.interceptors.SecondHandlerInterceptor – afterCompletion com.atguigu.springmvc.interceptors.FirstHandlerInterceptor – afterCompletion |
- 执行顺序图解
- 从源代码的执行角度分析流程:
boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception { if (getInterceptors() != null) { for (int i = 0; i < getInterceptors().length; i++) { HandlerInterceptor interceptor = getInterceptors()[i]; if (!interceptor.preHandle(request, response, this.handler)) { triggerAfterCompletion(request, response, null); return false; } this.interceptorIndex = i; } } return true; } |
void applyPostHandle(HttpServletRequest request, HttpServletResponse response, ModelAndView mv) throws Exception { if (getInterceptors() == null) { return; } for (int i = getInterceptors().length – 1; i >= 0; i–) { HandlerInterceptor interceptor = getInterceptors()[i]; interceptor.postHandle(request, response, this.handler, mv); } } |
void triggerAfterCompletion(HttpServletRequest request, HttpServletResponse response, Exception ex) throws Exception {
if (getInterceptors() == null) { return; } for (int i = this.interceptorIndex; i >= 0; i–) { HandlerInterceptor interceptor = getInterceptors()[i]; try { interceptor.afterCompletion(request, response, this.handler, ex); } catch (Throwable ex2) { logger.error(“HandlerInterceptor.afterCompletion threw exception”, ex2); } } } |
- 源码分析:分析interceptorIndex的值情况
上一篇: 大数据培训之完全分布式运行模式(开发重点)
下一篇: java培训异常处理之HandlerExceptionResolver