00:00
好,那我们刚才呢,这个讲了该如何创建拦截器,对吧?怎么来创建呀,是不是创建一个类,然后来实现handle intercept就可以,对不对,其中有几个方法,三个方法啊好,然后呢,咱们下面还讲了这个如何去配置咱们的拦截器,因为不配置的话,它有用没有用,没有用啊好,再往下大家看那拦截器中的三个抽象方法,首先呢,大家看好了,第一个方法是pre handle pre handle呢是在咱们的控制器方法执行之前来执行,对吧?然后呢,它不玩类型的,这个返回时表示的就是是否拦截或放行,如果返回处则表示放行,如果说返回这个force的话,则表示拦截,这个咱们是不是已经看过了,对不对,对吧?再往下post handle动呢,是控制器方法执行之后来执行post handle after completion是处理完视图和模型数据,渲染视图完毕之后来执行after completion。
01:00
这个咱们是不是从源码里面咱们也能够看出来,是不是啊,好OK啊来下面呢,那咱们就来说一个问题,首先呢,大家注意,就是咱们多个拦截器的一个执行顺序,多个拦截器的执行顺序,如果说有多个拦截器的话,那当前的这些拦截器是怎么去执行的呢?那咱们下面就来看一下啊,首先呢,大家看我们刚才咱们已经创建了一个拦截器了,对吧,然后我在这儿再创建一个,然后咱们这个呢,就叫做SE sound,叫做second intercept,可不可以啊,可以吧,好OK,来那咱们创建完之后,大家看,那咱们在这儿是不是把这些这个咱们输出的信息是不是给它改一下,是不是就OK了,能看懂吧,好啊,行,那我们把这个写完之后,咱们要想让它有作用,咱们是不是也要在咱们的配置文件中进行配置,是不是啊,那咱们怎么配置呢?大家注意我把这个标签啊,然后咱们给它注释掉。
02:00
能看懂吧,然后呢,因为我们当前咱们以这种方式来配置的话,这两种方式配置它都是对什么请求进行拦截啊,所有请求进行拦截对不对?而我们下边的话是不是可以来自定义咱们的拦截规则,比如说杠星星就可以来拦截所有,但是呢,咱们还可以通过excclude mapping来设置咱们需要取消拦截的一些请求,能听懂吧啊,或者说不拦截的请求,那所以在这儿大家看好,我们就这样去配置啊,然后咱们的这两个拦截器,咱们都通过咱们上边的这两种方式配置可不可以啊,可以吧,好B,然后来写一个first,什么intercept OK,然后咱们再来配置一个ref,然后B等于second intercept能看懂,不知道为啥有不,因为这个类我是复制过来的嘛,对不对,所以说这上面是不是应该也是有标识为普通组件的注解,能看懂吗?
03:00
好啊,行,那这个时候大家想,如果说咱们现在有两个拦截器,它同时去有两个拦截器同时去拦截我们当前的请求,那他们的顺序应该是什么样的呢?是不是啊,那他们的顺序应该是什么样的呢?来,那我们下面咱们就来做一个例子啊,好,咱们来看一下当前我们的这个输出的信息,他们输出的一个顺序就OK了,大家注意这个顺序呢,咱们需要通过源码里边咱们去分析,因为咱们光看的话,咱们看到的是一个结果,至于他为什么会这样,那咱们还要去看源码,来首先大家来看啊,看好,比如说我们现在咱们就来访问咱们的首页,大家看好啊,来点击那第一次输出的信息有些多,咱们把它给清空掉,我们在这儿咱们再刷新,来大家看看一下,首先呢,然后咱们的first intercept的pre handle先输出能看懂,然后再输出咱们的second intercept里面的pre handle能看懂吧,好,然后再往下post handle的时候,你看pre handle是不是按照咱们的first和second的顺序,而我们的post。
04:15
Handle是不是应该是按照倒叙来执行的,能看懂不?先second再first,而咱们的after completion是不是也是按照倒叙来执行的,能看懂吧,好,OK,那为什么会出现这个问题呢?首先大家咱们先来归,咱们先来说一下他们这个顺序是怎么排的啊,大家要注意,它只跟我们当前咱们在我们的配置文件中配置的先后顺序有关,能听懂吧,你先配置谁,谁就在前,所以说咱们把配置的顺序然后来作为我们当前的一个标准,所以说大家会发现first就是我们的pre handle是按照我们配置的顺序来执行,能听懂不?而post handle和我们的after completion,它都是按我们配置的反序来执行,能听懂吧,能听懂吧,好,比如说大家看好,我在这儿把它两个的位置给换一下,能看懂吧,好,下面呢,我们在这儿咱们重新来进行。
05:15
部署大家看这个效果啊,这个时候应该是什么?Pre handle先second,在first post handle和咱们的after completion,应该先first再second,能听懂吧,好OK啊,咱们把这些东西清空掉,然后下面我们再来刷新,来先清空一下啊,好,然后咱们再来刷新,大家看是不是是不是啊,Free handle是不是先second再first post handle和after completion,然后是不是先first再second,能看懂吧,好OK啊,行,所以说这就是他的执行顺序。Pray handle会按照我们配置的顺序执行,而post handle和after completion会按照我们配置的反序来执行,能听懂吧?好,那我们下面咱们就来观察一下源码,那首先呢,咱为了看着方便一些,咱们就按照咱们的first和second的顺序来配置,能听懂不好的啊,来吧,来,咱们又到了愉快的看源码时间了是不是啊,来啊,愉快不愉快不愉不愉快,为什么不愉快,看的想睡觉是吧?啊,好想睡觉,看的非常烦躁是不是啊,啊,行啊,看不懂啊,这个拦截器的代码大家还是能看懂的,真的挺好看知道不?啊,真的挺好看啊来,那我们现在咱们就这样啊,怎么进入到咱们的源码里边啊,它是不是用来拦截我们的控制器方法的执行啊?那所以说咱们是不是可以在这个地。
06:54
地方是不是来打一个断点,或者说你要么你就直接去找到dispat of that,直接在咱们的dispat of that里面打断点,是不是也行,是不是啊好,那咱们就再看一次啊好,首先呢,我们现在咱们来看大家看好点击这刚才重新部署过了吧。
07:14
部署过了吧?啊,部署过了,那咱们来刷新一下,OK啊,那咱们是不是没有访问到这个地方,所以说没有进入到断点模式是不是啊,好,那我们下面咱们在这儿啊,大家看好,我们来访问我们当前咱们的test interceptor来点击之后是不是就进入到断断点模式中了,那我们当前的这个位置是不是应该是咱们的方法站对不对?好,然后咱们往下找,咱们有一个地方是不是dispatch solve let中的谁,Do dispatch1061行,这一句话是不是就是我们需要去看的内容,能看懂吗?好,OK,那我也跟大家说过,我说在他执行之前呢,这不就是我们当前的控制器方法的执行嘛,对不对,咱们说这个方法执行之前,在这个地方就是来调用谁呀,咱们的拦截器的pre handle方法能看懂吧?好,然后在我们的控制器方法执行之后,在这个地方就是来调用我们当前的拦截器。
08:14
的post的翻动方法能看懂不好,OK,然后再往下呢,然后我们的这个方法里面是不是来做后续的处理,渲染视图,图形处理模型数据对不对,这个方法在哪儿,点击之后是不是就在我们当前的这个类中,是不是啊,然后往下走,走到这,这是渲染视图没问题吧?好,然后再往下,然后走到这个地方,大家注意,这就是我们拦截器的after completion,能看懂不能看懂吧?好OK啊行,那我们先将咱们所有的这个断点呀,然后跳过,然后下面呢,咱们把控制台给它清空掉,然后我们再次来刷新页面,进入到我们当前的断点中,能看懂不好啊来,那我现在刷新之后,大家说应该先进入到谁。
09:06
应该先进入到谁?应该是先进到我们当前的1061行吗?大家说是不是啊,是啊是吗?我上面不还打了一个断点吗?对不对,应该是先进入到这儿能听懂吧,然后再进入到这儿,然后再进入到我们自己所写的控制器中,能听懂不好,然后再进入到我们当前的post handle,然后最后再进入到我们当前咱们的这个after completion中,进入到这儿能看懂吧,好OK啊行,那我现在就开始访问了,大家看好,点击大家看是不是先走到这儿了,好,那我们在看这个源码之前,然后首先大家需要来考虑一个问题,就是我们当前的这个东西是什么?叫做map的handler,什么意思啊?Map的handler map的映射handler处理器,咱们说的处理器其实就是咱们的控。
10:07
制气方法能听懂不好,OK,所以说这个东西指的就是我们当前的一个执行链,什么叫做执行链呢?我鼠标放上去,大家自己看看这个东西叫啥?叫handler execution Cha handler叫处理,Execution叫执行,然后Cha是不是叫链的意思,咱们原来在过滤器中是不是学过filter Cha,学过没有学过吧,就是链的意思啊。所以说这个就是我们当前咱们的控制器的一个执行链,那这里面它都包含了什么数据呢?大家自己看,首先它包含了我们当前的控制器方法,这个大家能看懂不?来看这个描述,com.at硅谷点MVc.controller.test controller井号test intercept,大家说这是啥?不就是我们当前咱们所发送的请求所对应的控制器方法吗?大家说对不对对。
11:07
对,好,再往下看这个地方,AND3个什么interceptors interceptor是啥拦截器,所以说我们当前的执行链里面放的都是谁呀?大家说当前的执行链里面放的就是我们的控制器方法,以及处理当前控制器方法的拦截器,能听懂不能听懂不好,OK啊,行,那有陈老师为啥是三个拦截器呢?那大家想,那咱们创建的就俩,那另外一个是从这儿来的,那拦截器是spring VC定义的,那咱们能创建,那spring VC可不可以创建,可以,所以说这里面的拦截器有三个,两个是我们创我们自己创建的,而有一个是spring mvc创建的,能听懂吧,好OK,那所以大家要知道咱们当前咱们的这个东西是什么,是一个执行面,它都包含了几部分的数据啊,两部分,第一部。
12:07
本是我们当前所匹配的控制器方法,第二个部分就是我们当前的什么拦截器,能听懂吧,好,OK。那我们就进去呗,可以吧,首先大家先观察一下这个方法啊,什么时候会执行if中的内容啊,当我们的这个方法在调用的过程中,返回了true还是false会执行,返回的是false会执行,能听懂吧?好,OK,来,咱们来进入方法中,就进入到这儿了,好,然后呢,大家看在我们当前咱们的执行链里面有一个叫做intercept list,算了啊,咱们先回来大家看,我把这个东西咱们给它点开,你点这是不是可以来查看当前这一个对象的内部结构对不对?好,我点开之后大家看是不是这三个部分内容看懂了没?第一部分是咱们当前控制所对应的控制器方法,能看懂吧,第二个部分有个intercept list,里面所存放的就是咱们的三个拦截器,能听懂吧?首先大家看第一个拦截器,叫conversion service。
13:18
Posting intercept,这是咱们自己写的,不是不是,但是这俩是不是咱们自己写的,然后在这还有一个拦截器,所以叫in intercept index能看懂不好OK啊,行到这儿就结束了,然后下面咱们就进入到这个方法,那咱们现在进度方法里面,大家应该知道这是啥了吧?啊,这是啥拦截器集合嘛,里面放的不就是来拦截当前控制器方法的三个拦截器嘛,大家说是不是啊,是不是啊,对吧?好,OK,来这里面一共有三个拦截器,那负循环是不是就要对拦截器进行循环,拦截器集合进行循环,看A等于几啊,等于零,好,然后这个东西是应该等于几,它的长度是不是应该是等于三呢?那小于三,那不就相当于来我们的集合里面去便利我们的每一个拦截器吗?大家说对不对,是不是?
14:18
而且大家看按什么顺序,哎,加加是不是从零到一到二,所以应该是按照我们当前配置的顺序执行的,因为在咱们的这个集合里面,然后他们三个的拦截器,拦截器的顺序你看咱们这个不管,咱们就看这俩,这不就是咱们配置的顺序吗?大家说是不是,是吧,好,OK,来吧,看好了啊,为什么咱们的pre handle是按顺序执行的呢?是按配置的顺序执行的呢?看好了啊,这个时候大家说咱们是不是就获得了第一个拦截器啊,第一个拦截器是不是spring VC自己的对不对?鼠标放上去之后,Conversion service ex expsing intercept intercept能看懂吧,然后往下执行,那这不用说,它返回的肯定是true,大家说对不对,所以说这个if会执行,不会。
15:12
会不会不会这个if会执行不会啊,不,不会吧,往下走大家看是不是就直接走到这,你想想吧,咱们这一次看的是不是有三个拦截器,那我们之前没有看源码的时候,那是不是应该也有三个拦截器啊,那之所以咱们能够正常的访问到我们的控制器方法,那说明我们写的两个拦截器pre handle返回的是true,那spring VC给我们提供的拦截器返回的是不是也是true呀,是不是,是吧,所以说这个很简单啊,来大家再往下,你看我们每循环一次,是不是都要为我们的intercept index进行赋值,能看懂吧?第一次循环之后,我问大家这个值是几啊?零再循环一次,一再循环一次应该是二,能看懂不好,那所以说大家想,只要我们的pre handle,咱们不返回false,那咱们当前这个拦截器。
16:12
的索引是不是应该来指向的就是我们的什么,是不是最大,就是我们当前咱们的这一个拦截器集合里面拦截器的一个最大索引,大家说对不对,对吧,好OK,但是你看如果咱们某一个拦截器,它的pre handle返回了false,大家说这intercept index还会有这个,还会进行赋值吗?不会,那不会赋值,那大家说这个时候它对应的应该是谁?应该对应的是咱们的pre handle返回false的这个拦截器之前的这个拦截器的索引,大家说对不对,对不对,好好听啊,这东西不难,这是能看懂的,能听懂吧,好OK。大家记好这个东西啊,这是有用的,知道吧,知道吧,好,这东西是有用的啊,来,咱们再往下走,再执行,大家看第二次获取的是不是就first intercept了,是不是?好,咱们再往下走,大家看这句话是不是就输出了,因为咱们在这是不是调用了pre handle方法,能看懂吧?好啊,来这个时候它等于几,你再执行一次,它该等于几了,该等于一了,没问题吧?好,再执行一次,大家看是不是second intercept pre canle出来了,没出来了,再执行它等于几啊,等于二没问题吧,好,OK,然后再执行就没了吧,那return触,大家看,也就是这个方法是不是就return触了,是不是,那return触了,咱们的if会执行不会,不会,那不会咱们就继续执行,执行到这儿,大家说这个方法是不是就是来调用我们的控制器方法的,对不对,对吧,最终是不是统一返回。
17:59
J model and view没问题吧,好,OK,来直接跳过,OK,跳到这儿能看懂不?好,然后再跳,然后跳到这儿,这是不是应该咱们拦截器的post handle能看懂不?大家看这还是咱们刚才看到的执行链啊,看到没看到了吧?来调用post handle,咱们进去大家就知道为啥它是按反序执行了,知道吧,来看好啊,进去之后大家自己看A减减,你就看这个就完事了是吧?哎,大家说是不是啊,咱们看这个就完事了啊,只要有A减减,你看初值是谁,Size减一,Size是三,减一是几啊二然后呢,大于等于0I减减,第一次循环是二是不是最后一个拦截器第二次循环是一,倒数第二个,然后再一次循环是零。
18:59
是咱们的第一个拦截器,这能听懂不?所以说这源码这能看懂吧,好OK啊,来咱们往下走走,大家看是不是咱们的second intercept post handle能看懂吧,然后再往下执行一次,应该是first intercept post handle能看懂吧,然后咱们再执行,那因为这个拦截器是SPVC提供的,那所以说它是不会输出的,能看懂吧,好OK啊,来执行之后大家看就没了来。
19:31
好,OK,大家看一下,那咱们刚才是不是断点是打到这儿啊,没问题吧,好,OK,然后咱们继续往下走,咱们是不是就可以来直接跳过断点,就可以跳到我们当前的哪个位置呀,跳到我们当前执行after compleletion的位置,对不对啊,好,直接跳过,大家看是不是直接跳到这了,能看懂吗?好,OK,来判断我们当前咱们的一个直行链,如果不等于空,然后就来调用它的after compassion方法,好,这个东西大家都看了,等于空,不等于啊,不等于,所以说这个会执行不会会大家看好啊,看好我们当前咱们的这个东西,它的循环就是咱们的每一个拦截器的after completion方法的执行,跟谁有关系呢?跟我们的intercept index有关系,大家还记得不拦截器的索引有印象没?咱们刚才在handle中看到的美。
20:31
执行一次是不是就要为它赋值是不是对吧?每执行一个拦截器的pre handle,咱们的intercept index是不是就得赋值呀,对不对?它是怎么赋值的,怎么赋值的?每执行一次,每执行一个拦截器的pre handle,咱们的intercept index就等于当前这个拦截器在集合中的索引,对不对,对吧?我进去了啊,看好这个大家也能看懂啊,看好了进去之后看,哎,等于谁啊?Intercept index看到了没?大家告诉我现在它等于几啊?有印象没有?这东西是不是等于二啊?咱们一共三个拦截器吗?三个拦截器的pre handle是不是都正常执行了,有印象吧?所以说intercept index是等于二的,能听懂不好,然后大家再看I大于等于零,I减减,所以说为什么after completion。
21:31
也是反序执行,大家看有问题没能看懂吧,能看懂吧,好,OK,然后下面咱们先来执行第一个大家看好,这个时候咱们获得的这个应该是谁?应该是咱们的second intercept,大家说对不对,对吧?好,然后再往下调用after completion,大家看输出了没,输出了好,再往下执行,大家再看,这个时候输出的应该是first intercept after completion能看懂吗?所以说咱们从源码里面大家能看出来,为什么咱们的pre handle按顺序,按配置的顺序,而post handle和after completion都按咱们配置的反序执行,这能看懂吧?这个原法能看懂不?这个你要看不懂啊,你就回去上SE去吧啊。
22:24
啊,行吧,啊来,咱们把这个源码给跳过啊,行,所以大家来看咱们的这个笔记里面,如果有多个拦截器执行的时候,大家看我们的第一种情况,就像是我们现在写的一样,我们的每个拦截器的pre handle都咋的了?都返回的是不是应该是true,那这个时候呢,这多个拦截器的执行顺序,然后跟咱们在SPVC中配置的顺序有关,Pre handle会按照配置的顺序执行,而post handle和after completion会按照配置的反序执行,能看懂吗?能看懂吗?哎,好啊。
我来说两句