00:00
好,那接下来呢,我们快速看一下拦截器的原理,那我们还是来打上断点,首先我们以这个慢点HTMMR这个方法测试为例,我们同时呢给dispa sol的dopa方法打上断点,那们现在呢,以debug模式启动,我们看一下整个拦截器它是怎么样的一个工作过程,我们来看,我们来访问慢页面的时候,拦截器呢会核实来介入进行工作,当然我们访问任何请求都行,因为所有的这个请求,我们现在拦截器呢已经都加上了,好,我们现在来测试,我们来local host,我们先来访问我们这个本机的项目,我们先已登录进来,我们把这些呢请求都先放行,我们把这个断点呢,先禁用的先禁用掉,好。所有的弹点呢,都先禁用掉,禁用掉以后呢,让它直接能放行过去的,那在这debug冒好,它现在呢全放行过去,现在我们来登录进来123456走好,进来以后呢,我们接下来启用我们的这个断点,我们来进行测试,来我们的这个断联呢,Index controltrler,我们来点上,我们现在不用测页面了,那就给dispa这个do thispach这断点我们来给它启用好,那接下来呢,我们来测试,我来访问慢页面回车,我来看一下会有什么样的效果,首先我们来看一下我们的request请求,我们先来确认一下路径,好访问慢点HTML没问题,来一直往下走,然后呢,接下来来到熟悉的一步,先get handle了,Get handle呢,会根据当前请求拿到一个我们相当于谁能处理它,那我们直接放行,放行以后呢,它会给我们在这找到一个handle到了,相当于他知道呢,我们当前请求是由index controltrler man page这个方法执行,而且呢,它不止给我们找到了。
01:43
哪个处理器来处理,而且这一块还有一个叫intercept list,下面找到一个拦截气垫,那我们把这个呢,展开完整的就是我们把这个展开,我们看一下它的这个图呢,相当于我们第一步根据当前请求找到哪个处理器能处理,那第一步呢,给我们找到的就是这个叫handler execution Cha,这个呢,我们翻译过来就叫拦截器的执行量,好把这个图呢。
02:11
结果来这个呢叫handler是处理器执行链,它是呢这个类型的,所以呢,里边有我们的handler,我们当前两个方法要处理这个请求,还有我们的这个拦截器垫intercept list,而这两个呢是默认的拦截器,这一个是我们自己写的拦截器,下面两个拦截器呢,任何方法都会执行好,我们把这个呢点一个完成,所以我们来看一下啊第一步,第一步根据当前请求,根据当前请求找到找到我们可以处理请求的咱们这个handle了,以及以及handleler的所有拦截器,以及handle到了的所有拦截器,所以我们看到的呢,就是这个人家完整的是呢,相当于找到我们这个看到了excu生差,那我们的这个拦截器的执行量excution。
03:04
好,我们来把这个打印过来,看到了,看到了execution,我们拦截器的整个执行链,所以呢,这是我们核心的一步,这些执行链呢,指的就是谁能处理这个请求及这个请求要用哪些拦截器来来拦截,好这是我们第一步,像我们来找到这个啊请求的handlele以及它的拦截器,我们一直往下走,现在来找a adapter,相当于来找适配器,适配器呢最终要执行目标方法,那我们就来往下走,我们来看一下啊,在执行目标方法的前置,这有一个步骤叫map handler,叫a apply handle,所以呢,我们看这一块呢,下边才是执行目标方法,而在前边它呢做了一个非判断,我们可以来看一下这个,而相当于map handle,调用a play pre handle这个方法,如果呢,整个这个处理完,返回的是false,非false就是处相当于就return出去,意思呢,我们可以把这个方法拿过来,所以呢,我们会。
04:05
看到目标方法执行之前,先会执行我们的这个拦截器的pre handle方法,那很多同学怎么知道这是普handle,来step into进来,我们就能看到它拿到intercept list来做一个正向的for循环,所以接下来呢,它for循环从里边拿到挨个的这个拦截器,我们现在拿到第一个拦截器叫log intercept,然后呢,拦截器呢,接下来调用它的pre handle方法,所以我们来step into,我们可以来进来,那我们现在调用到了我们这个log intercept的这个普handle,而我们这个普handle呢,我们现在先会来判断我们当前用户登录了没,因为我们已经登录了,所以我们直接返回为出,所以第一个拦截器如果它返回false,注意,如果我们拦截器直接给它false,给它拦截了,它在这有一个叫try after comp comption点进来它呢,相当于是把拦截器,接下来大家看啊,从拦截器的所有到零开始减减,相当于一个倒序执行每一个拦截器的after comp。
05:05
所以接下来我们一定要注意这个顺序,第二个先来执行,先来顺序执行,大家一定记住我们这四个字,顺序执行所有拦截器的。顺序执行所有拦截器,拦截器的咱们这个pre handle方法,Handle方法,哎,我们能看到,而且呢,这个pre handle方法如果执行成功,如果返回为处,如果当前拦截器,当前拦截器,当前拦截器啊pre handle返回为处,相当于我们这个放行,那放行的话呢,它这一块的关键判断我们可以来到这儿,如果我们这是返回为处,非处就是false,我们就进不去,那我们接下来就执行下一个拦截器,所以呢,我们如果返回为处,则执行,则执行下一个拦截器的pre handle,但是呢,如果返回为false,如果当前拦截器返回为false,然后呢,直接触发,直接我们看到这,它会直接触发,触发什么呢?
06:19
我们来看一下我们的这个呃,页面的写法,直接触发呢叫tri after comp,那触发已经执行的拦截器,它在这呢,记录一下我们当前是第几个拦截器,记录了一下索引,然后呢,倒叙触发已经执行了的拦截器的after competition,所以大家这一块呢,直接,然后呢触发倒叙,然后呢直接倒叙执行所有。执行所有已经已经执行了的拦截器的什么方法呢?After comp就是这个方法,所以这相当于如果我有这么三个拦截器,然后呢,我们第一个拦截器放行了,第二个拦截器呢也放行了,但第三个拦截器没放行,那接下来呢,它就会倒叙执行,把第二个拦截器的after comp执行了,再来执行第一个拦截器的after comple,哎,就是这么一个效果,所以我们根据这个圆码呢,我们看到了这个效果,那接下来我们来就来继续,那既然我们第一个拦截器返回为处了,所以只要返回为处,它就记录我们当前执行到第几个拦截器了,只记录一下所引第二个拦截器呢,默认的这些拦截器都返回为处,所以至此,只要所有拦截器返回为处,只要任何一个拦截器有问题,触发完以后呢,它就返回false,返回false呢,我们将当就结束了,现在我们所有拦截器返回为触,所以呢,这个非处那就。
07:48
不是force,我们这个进不来,如果我们拦截器有任何一个失败,直接跳跳回去,我们看到我们这个目标方法在下一步才执行,目标方法都不会执行,所以呢,我们接下来第三个执行所有的拦截器的handle,如果任何一个,如果任何任何一个一个。
08:11
拦截器执行失败,执行失败这拦截器我们就要返回false,那么就直接直接跳出不执行目标方法啊,直接跳出不执行目标方法,而我们现在呢,现在是所有拦截器,所有拦截器都返回处,返回处我们现在是这个状态,返回处呢现我们现在就来执行目标方法,执行目标方法,所以我们现在看到了我们这一步来执行目标方法,因为我们所有拦截器都返回了,所以我们接下来执行目标方法,我们来到卖HTMMR,当目标方法执行完以后,来目标方法的其他的这些执行流程,我们不管就直接给他返回。好,这个流程呢,我们都不管,把这些呢,直接返回,返回好这一步呢,就是目标方法,只要目标方法执行完,那接下来大家注意,目标方法执行完成以后,包括我们来看我们控制台的这个打印,我们这个拦截器的pre handle执行了,然后呢,目标方法慢呃,当前方法是manage也执行了,接下来呢,就会来到这,然后呢叫apply post handle,所目标方法执行完以后呢,Step into,它又把所有的拦截器拿来,大家又注意,这是从拦截器开始到A减减,这又是一个倒叙执所有的post handle,所以呢,接下来倒序执行第五个倒叙执行,倒叙执行所有拦截器的post handle动方法,这个拦截器的原理呢,其实跟我们filter一样,你顺序进来,普HANDLE12三进顺序进来,然后呢,倒叙回去。
09:56
哎,就是这么个效果,然后呢,我们的posts handle,它就在这挨个执行,那我们就不用进去看了,第一个拦截器post handle加第二个啊,拦截器post handle,大家注意索引是倒着来简简的,所以我们倒去执行,执行完了以后呢,接下来在这有一个process dispatch result,接下来就是处理页面,而大家注意,只要期间我们有任何异常,也会触发after comp,所以呢,我们前边的所有步骤,前面的步骤有任何异常,有任何异常都会触发,都都会直接触发,触发我们的什么呢?After comption,所有拦截器的这个after comption方法。
10:46
把这个写上触发,所以呢,有可能就是我们拦截器的pre handle动,我在执行的时候,代码一不小心写错了,直接报异常,他也会直接触发after comp,后边的这些逻辑呢,都不会走,所以任何一处如果从这炸了,那就直接来到第六步,那而我们现在呢,一切是正常,我们来到页面渲染逻辑,我们来到页面渲染逻辑呢,我们来step into看一下,来到页面渲染逻辑呢,这就是大家前面知道的流程,拿到model and view,我们现在要知道去慢页面,然后呢,接下来他render来渲染慢页面,好,我们现在页面渲染完,只要有异常呢,它又会记录异常,大家注意啊,我们页面处理完了以后接来注意这一个叫map handle tri after comp,所以呢,相当于我们在这呢,只要页面一切渲染处正常,又会在这倒叙的触发每一个拦截器的after competition方法,所以呢,页面第六步和第七步,然后呢,我们这个第七步就是页面。
11:46
渲染完成以后,渲染完成以后,把页面成功渲染完成也会也会咱们这个倒叙出发,倒叙出发after comp,所以呢,其实就是这么一个简单的逻辑,都会直接倒叙出发,哎,我们after comp呢,都是倒序出发,所以呢用简单的一个图来表示,那就是这样子的,我们来看一下这个图,那就是如果我们有多个拦截器,它呢,就是每一个拦截器先挨个执行pre handle动方法,再到目标方法,然后呢倒着回来,每一个拦截器的post handle动,最终呢跳到页面渲染,因为渲染成功以后呢,又是每一个拦截器的倒着的after competition,而且只要我们前置期间有任何一处出现了爆炸,比如我们这个拦截器二执行的时候呢,它出现了异常,那已经执行成功的拦截器,那它呢,就会把after comp立即触发,所以呢,我们相当于只要你有异常就立即触发,我们已经执行完了。
12:46
的拦截器的after condition方法,但未执行到的拦截器,比如我们拦截器二这个执行这出了问题了,拦截器三的pre handle都没执行,所以我们自然不会触发拦截器的pre,呃,这个拦截器三的after comp,所以大家已经记住就是它永远都会触发已经执行了的所有拦截器的这个after comp清理工作,哎,这就是我们的整个这个图把这个图呢,我们可以来来截图到这,这是我们拦截器的整个原理,那么拦截器的真正的它整个执行的整个顺序的位置也在源码处也都找到了,所以呢,大家在下边也可以自己debug来看一下。
我来说两句