拦截器原理

还是老样子,在DispatcherServlet类中的doDispatch()方法打上断点,如图:
在这里插入图片描述

拦截器的使用

见上篇文章!!!

分析

接下来,客户端发起请求,方法中拿到对应的请求,接着往下继续调试。

  1. 到1036行处执行完后拿到对应的处理器(HandlerExecutionChain,可以处理请求的handler以及handler的所有拦截器)。
    在这里插入图片描述
    在这里插入图片描述
    我们可以发现在处理器链中包含了我们自己定义的了。
  2. 接着往下走,拿到对应的适配器之后(HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler();),在执行目标方法之前还有一个步骤——执行拦截器的preHandle()方法。
    在这里插入图片描述
    进入其中我们根据源码发现,拿到拦截器链的size,顺序循环执行拦截器的preHandle()方法。
    在这里插入图片描述
    如果当前拦截器的preHandle()方法返回false,则执行triggerAfterCompletion(request, response, null)进入其中根据源码我们又可以得知,直接倒序执行所有已经执行了的拦截器的afterCompletion()。
    在这里插入图片描述
    根据以下源码又可得知,如若任何一个拦截器调用方法返回false,直接return不执行目标方法。
    在这里插入图片描述
  3. 正常情况一切运行正常,继续往下调试,目标方法被执行(mv = ha.handle(processedRequest, response, mappedHandler.getHandler())),接着往下。
  4. 目标方法被执行之后,接下来在1067行处执行拦截器中的postHandle()方法。在这里有点要注意,是倒序执行所有拦截器的postHandle方法!!! 源码如下
    在这里插入图片描述
    进入目前方法,可得知是倒序执行所有拦截器的postHandle()方法。
    在这里插入图片描述
    执行完postHandle()方法之后,就进行页面处理,在这里要注意的是有个==try{}catch(Exception ex)finally{}==异常处理块,作用就是之前的步骤任何一处发生异常都会直接倒序触发 afterCompletion()方法!!!
    在这里插入图片描述
  5. 接下来就是页面处理(processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException)),进入此方法。如图:
    在这里插入图片描述
    其中就包括页面渲染render()等等,在页面渲染之后,也会倒序触发 afterCompletion()方法,标注了两个断点,可方便小伙伴们定位。

总结

在这里插入图片描述
如若有问题,谢谢提醒,共同进步!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值