SpringMVC源码分析之——处理请求核心流程之拦截器的调用

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 //当前调用完成的拦截器数组下标
}

拦截器分三种:

  1. 前置拦截器
  2. 中置拦截器
  3. 后置拦截器

调用的时候其实是循环所有拦截器分别调用preHandle,postHandle,afterCompletion 方法

源码分析:

1.前置拦截器的调用

可以看到前置拦截器是在调用controller方法之前调用的,如果某一个拦截器的用preHandle返回fasle,就直接不会掉controller方法和后续的操作了

image

循环所有的拦截器,调用他们的preHandle方法

image

注意这里有个interceptorIndex,表示当前调用成功拦截器的下标

如果某个拦截器的PreHandle方法返回fasle,因为涉及到资源的释放,需要调前面执行成功的所有拦截器的afterCompletion

image

然后根据下标倒序执行afterCompletion

image

2.中置拦截器的调用

中置拦截器是在调用controlelr方法之后调的

image

并且没有返回值,不能起阻断作用

image

3.后置拦截器的调用

调用情况:

  1. 抛出异常,会调

    image

  2. 正常执行,在视图渲染之后会调

    image

    image

原文:springmvc源码分析:处理请求核心流程之拦截器的调用

猜你喜欢

转载自blog.csdn.net/meser88/article/details/120865491