00:00
好,那下面呢,我们就来验证一下,如果咱们的某一个拦截器,它的pre handle返回的是false的情况,比如说然后我们现在咱们把最后一个拦截器就是second intercept,然后把它的pre handle,咱们让他来返回一个false OK吧,好,这个时候大家再来看一下它是怎么来执行的啊,首先呢,然后咱们先来一个重新部署。其实大家应该能想象到这个过程吧,因为咱们只要有一个拦截器返回的是false,然后我们当前咱们是并不会来执行谁的,并不会来执行post handle的,因为它直接来调用的就是咱们的after completion方法,对吧?好,来咱们测试一下啊,来一个刷新,大家看,那我们现在咱们再进入到这个方法中,首先咱们第一个拦截器还是咱们spring VC默认的那一个,对吧?然后大家看它的pre handle返回的是true,那咱们就不管了,看好这个时候这个intercept index,为什么咱们要观察它呢?大家还记得不?咱们的after completion,然后它的拦截器的一个循环,然后咱们就是跟这个东西有关系的,对不对?好。
01:10
然后下面咱们再继续往下。咱们的第二个拦截器。Handle返回的也是处,然后咱们的第三个拦截器。Pre handle返回的是false,然后所以这个时候这个if条件是成立的,那所以它就要执行if中的内容,但是大家看好intercept index是等于谁的,是等于我们当前咱们的second intercept之前的这个拦截器,因为它的pre handle返回的是false嘛,对不对?所以说他在这儿还会来进行扶持吗?不会,他就直接走到这儿了。然后但是我们当前咱们的拦截器的索引,然后是把谁复制给他了,他现在已经循环了两个了,对吧,所以说我们当前这个索引的值应该是等于几的,等于一的,然后下面呢,大家看,你看它返回了false,所以说if条件成立,那我们就走到咱们的if方法中了,然后下面咱们再来进入到这个方法中,大家看,这就是我们刚才看到那个谁呀,叫做trigger after completion,然后呢,它是根据咱们的intercept index来执行的,这个时候它等于几,它是等于一的。
02:18
对吧,然后这个一的索引,索引为一对应的拦截,其实first intercept OK吧,然后下面呢,我们来看,然后现在咱们来获取的拦截器就是咱们的first intercept,然后来执行after completion方法,然后所以说我们现在咱们输出的结果呀,大家看一下是不是就有first intercept它所对应的after completion了,然后我们下面咱们再来一次执行,然后这个时候获取的拦截器应该是spring VC中默认的那一个,对不对?好,咱们再往下执行,OK,这就执行完了。这方法就完事了啊,然后我们现在咱们回到这儿,然后大家看,你看它输出的都有谁,我们当前的first intercept,然后的pre handle执行了,Second intercept的pre handle也执行了,对吧?但是咱们的post handle都执行了没有,没有一个post handle是执行的,然后咱们的first intercept的after compleletion是不是也执行了,对不对,对吧?然后下面大家再来看,你看它都返回force了,那我们的这个方法是不是就执行完了,执行完了之后,因为它是false,所以说前面加上一个叹号,那咱们的if条件就成立了,咱们再往下执行,大家看就直接结束了。
03:35
OK吧,就直接结束了啊,然后最后就直接到finally里面了,因为不管咱们有没有异常,这个finally它肯定是要执行的,对不对,好啊,然后我们现在咱们直接跳过,大家注意你看啊,然后咱们输出的内容,然后pre handle呢,然后是first intercept执行,Second intercept执行,然后咱们的post handle都不执行,然后而after completion,然后是只有first intercept执行,那所以咱们在这就可以来总结一下呀,大家想想这个东西该怎么去描述。
04:08
啊该怎么去描述好,然后若。若咱们的拦截器中,拦截器烂机器拦截器中对吧?然后呢,它有某个拦截器,有某个拦截器的prele啊pre handle方法,然后返回了谁呀,返回返回了false好,然后这个时候它是怎么执行的呢?我先给大家总结一下,大家看一下看对不对啊,首先呢,咱们的pre handle看好啊,然后是我们当前咱们拦截器。啊,然后咱们拦截器的pre handle返回返回false啊返回对吧,File拦截器的pre handle返回false,然后和他之和他之前的。
05:06
拦截器,拦截器到handle都会知晓,Handle handle方法都会知晓。看好啊,然后拦截器的pre handle返回false和它之前的拦截器的pre handle方法它都会执行,对吧?因为我们现在咱们是second intercept的pre handle返回了false,所以说你看他大家看一下他俩是不是都执行啊,对不对,那至于它之后的这个拦截期的pre handle会不会执行了,肯定不执行,因为我们当前大家看咱们再来看我们的这个代码啊,如果说我们的pre handle方法里面如果有一个返回false,它就不继续去进行循环了呀,然后我们在这是不是就直接跳到咱们的after completion方法中的执行了,对不对,对吧?好,下面呢,我们再继续总结,然后呢,我们当前咱们所有的,然后拦截器的post handle它都不执行,大家注意啊,都不执行,行,然后还有呢,就是我们当前咱们的最后一个对吧,然后咱们最后一个呢,大家想一下。
06:14
然后after completion谁会执行,是不是拦截器的pre,拦截器的pre handle方法返回false之前的这个after completion啊,返回之前的拦截器的拦截器的after completion。啊,然后会执行啊,这个大家想一下看对不对,对吧,然后我们当前咱们的second。Intercept,然后pre handle返回的是force,然后我们当前咱们的intercept,咱们的first intercept,然后他它的这个after compleletion是不是执行了,对不对?因为在我们的源码里面,咱们就能够看到咱们的after completion它的执行跟谁有关系,跟它有关系,而我们是在循环之后,调用了handle之后,才把当前咱们拦截器的索引给它复持的,所以说如果当前的某个拦截器的pre handle返回了false,那大家说这个时候我们当前的这个intercept index是不是等于谁等于返回false之前的。
07:20
这个拦截器的索引对吧,所以说只有。返回false之前的这个拦截器的after completion会执行啊,行,这个大家注意OK,然后呢,其实这东西啊,其实就是带着带着大家去看看源码啊,你说这个东西它有没有意义呢?咱们以后需不需要去考虑说有多个拦截器,某个拦截器什么pre handle,返回false,谁会执行谁不会执行的,不会。OK吧,咱们只是来锻炼大家去看源码的这个能力啊好,那比如说我现在我再问大家一个问题,如果我现在我的first intercept,然后他的这个pre handle返回了false,大家说这个时候都谁会执行?
08:02
啊,大家想想。这个时候都谁会执行,如果他的intercept返回的时候,这个pre handle返回的是false,对吧?谁会执行,首先咱们的pre handle谁会执行,是不是first intercept的pre handle会执行,你不执行,我也不知道它返回的是true还是false呀,对不对?好然后呢,咱们所有的拦截器的post handle都不执行。对不对,然后我们当前呢,然后咱们的这个first intercept after completion会执行不会也不会。也是不会执行的啊,只有谁呀,只有默认的那个拦截器SPAVC自带的那个拦截器的after completion才会执行,知道吧,哎,行好,这个大家一定要看好啊,好,所以说呢,这个答案就是趁着咱们学习这个spring VC它的拦截器的一个这个问题啊,然后大家可以去锻炼一下自己看源码的一个能力,对不对,好啊。行,那我们现在呢,然后咱们再把这个second intercept,它的这个给改成是TR有一处啊,OK,然后那我们现在咱们的拦截器呢,大家注意咱们就讲完了啊,这里面我们主要来说的就几个问题,首先第一个它该如何创建,第二个它该如何配置,第三个然后咱们的每个拦截器在哪个位置执行,然后咱们的第四个问题就是我们的拦截器,多个拦截器的执行顺序。
09:25
对吧,然后这里面我们是不是又通过源码,然后来观察了一下它的结果对不对,然后呢,咱们也给大家说了一种特殊情况,比如说handle如果返回false的时候,我们当前咱们的各个拦截器中的这三个方法又该如何去执行,对不对?所以说最后一个问题的话,大家就去这个就当是看咱们的源码就可以啊好。OK。那行,那咱们的拦截器讲完之后,下面咱们需要讲的一个问题,叫做异常处理器啊,就是专门来处理咱们的控制器方法中的这个异常的啊OK。
我来说两句