![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SMyADO1YmNlZWY3EWMiVTMzYzX5UTMyYTM1AzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
图:自定义拦截器类
图:配置自定义拦截器类
图:HandlerExecutionChain.java的applyPreHandle方法,调用每个拦截器的preHandle方法
如果某个拦截器的preHandle方法返回了false,那么拦截器链上的之后的拦截器也不会被调用,目标方法也不会被调用;
图:可以在该方法中做权限检查,日志和事务等
可以在该方法中修改域中的属性或者修改转向的视图
图:注意mvc:interceptor的使用方法
图:HandlerExecutionChain类的applyPostHandle方法
从i=getInterceptors().length - 1可以理解为什么postHandle方法的调用是倒序的了。
图:HandlerExecutionChain类对拦截器的afterCompletion方法的调用
从i>=0可以很清楚的理解,对interceptor的afterCompletion方法的调用也是倒序的;
变量interceptorIndex的含义就是拦截器链中preHandle方法返回true的最大拦截器索引;