DispatchServlet处理请求核心流程:
1. getHandler(processedRequest) 获取具体要执行的HandlerExecutionChain
2. getHandlerAdapter 获取处理适配器
3. mappedHandler.applyPreHandle 调用前置拦截器
4. 执行controller.method方法
5. mappedHandler.applyPostHandle 调用中置拦截器
6. processDispatchResult 视图的渲染
7. 调用后置拦截器
前面讲到经过上面的第一步操作之后,所有的拦截器被收集,并保存到了HandlerExecutionChain对象中。
handlerExecutionChain:{
//就是上一篇讲到的MethodHandle
hanlde:{
bean: controller对象
beanFactory: bean工厂
beanType: bean类型
method: Method对象
parameters: 方法参数列表
},
interceptors:[] //要调用的拦截器数组
interceptorList:[] //要调用的拦截器list
interceptorIndex:int //当前调用完成的拦截器数组下标
}
拦截器分三种:
- 前置拦截器
- 中置拦截器
- 后置拦截器
调用的时候其实是循环所有拦截器分别调用preHandle,postHandle,afterCompletion 方法
源码分析:
1.前置拦截器的调用
可以看到前置拦截器是在调用controller方法之前调用的,如果某一个拦截器的用preHandle返回fasle,就直接不会掉controller方法和后续的操作了
循环所有的拦截器,调用他们的preHandle方法
注意这里有个interceptorIndex,表示当前调用成功拦截器的下标
如果某个拦截器的PreHandle方法返回fasle,因为涉及到资源的释放,需要调前面执行成功的所有拦截器的afterCompletion
然后根据下标倒序执行afterCompletion
2.中置拦截器的调用
中置拦截器是在调用controlelr方法之后调的
并且没有返回值,不能起阻断作用
3.后置拦截器的调用
调用情况:
- 抛出异常,会调
- 正常执行,在视图渲染之后会调