00:00
这节课呢,我们来讲一下拦截器。我们分为三小节来讲,第一小节说一个拦截器的Hollywood,第二小节来研究一下拦截器的配置。第三小节,一起学习一下,如果要是有多个拦截器的话,那么他们那个方法的调用顺序是什么样的?这节课先来看这个Hollywood。首先呢,我们需要自定义一个拦截器,那只需要实现这个handler intercept接口就可以了。第二步我们需要在配置文件里边配置一下,大家想想我们在前边学习的时候呢,实际上已经配置过了,对吧?诶。等一下。国际化的时候收配了一个拦截器啊,诶,配置方式我们就使用这样的方式,OK,开始我们的hello world,首先呢,我来新建一个包。Intercepts。
01:03
新建一个拦截器,叫first intercept。它需要实现一个接口。Handler。Ceptl ctrl1好,我们需要实现这三个方法,这三个方法呢,暂时我在每个里边啊,我都打一句话。首先我来加入这个方法,名空格。都打一下CTRLCCTRLV。CTRL方法名加上。我们注意到啊,第一个pre handle方法,这个返回值是false,我们给它改为出。
02:01
然后呢,我们需要在配置文件里边来配置一下。那于是我把这个把这个注释放底下了哈。配置自定义的拦截器。B class first intercept搞定,现在我们可以来执行一下。我们直接请求这个employees,我们看到这三个方法这样就执行了是吧,这样的话呢,这个Hollywood实际上就说完了。先来做一个小结。首先需要搞一个自定义的拦截器,实现这个接口就可以,然后呢,在spring VT配置文件里边通过。Mvc intercepts配置一个并节点给它加进去这个拦截器,这个拦截器就可以起作用了,对吧?下边我们来详细的说一下这三个方法。
03:09
啊,这三个方法是什么时候被调用的。以及这个返回处还是返回false有什么关系?好吧,我在每一个上面都加上一个断点。先停掉,然后呢,目标方法也加一个断点。加了是吧,看一共是四个端点好的。Debug执行。我刷新。我们注意到先执行的pre handle方法是吧?实际上你根据这个方法名额就能想到在目标方法之前被调用叫pre handle,什么时候执行的呢?939行,我们看一下。这个方法呀,实际上是。
04:02
Do dispatch方法。我们在讲VC运行流程的时候,还会来说这个方法,那实际上。我们看啊,实际上这个九百四十五行呢,是去执行目标方法,所以说。Han是在目标方法之前被调用的,看到了吧,诶在目标方法之前被调用。还有其他信息吗?有一个大家看,如果我在调这个方法的时候,要是返回一个false的话,你发现。瑞了吧?一瑞不要紧。后边的这个目标方法是不是不能执行了呀?哎,所以说点进去值得看一下怎么执行的呢?嗯,它会遍历所有的拦截器,然后去尝试调拦截器的pre handle方法吧,如果这个方法返回的值是false的话。我就return for OK,这个1RETURN for的话,说明后续的拦截器也不会被调用了吧。
05:06
能懂吧,你这块这个return,我这个循环不也结束了吗?所以说如果。某一个拦截器的pre handle方法返回false的话,后续的拦截器不会被调用。而且目标方法也不会被调用,看到了吧,返回处的话就接着执行呗。哎,这就是我们说的这个叫什么呀?叫pre handle方法啊,我们首先我们handle handle方法,我们先来做一个。注释说该方法在目标方法之前被调用说若返回值为true,则。继续调用后续的拦截器和目标方法。若返回值为false,则不会再。
06:17
调用后续的拦截器和目标方法好了,那我们就看一下它返回值是false的情况呗。这样吧,是处的情况的话呢,我是处的情况,我们再看一下。放心。这样来。点一下好了,是处过来。目标方法,然后是post,然后结束,我们看一下返回值是false的情况。False。好的。
07:00
Debug重来。回退。点。注意哈,返回值是false,那于是呢,我来看一下这个方法吧,返回值是false过来诶,那这个时候这个就能进得来了吧。你瞧瞧。返回值是什么呀?返回值是false。这个时候的话呢,他就结束了是吧,刚才我这块点的有点问题,我们再重新来一遍。刷新,大家看,这个返回值是false过来。在这儿呢,进来他会执行这个。131行好了,下一步执行的132行是返回值是false啦,回退false 940行进来结束。真的就结束了,返回值是false的情况,看到了吧,回来好的。
08:03
好的,下边的话呢,我们来看什么呀,我们来看这个叫。Post handle什么时候被调用的?继续。回退哦。返回值是true,要不的话这个post执行不到。点击。走。过来目标方法好,Post什么时候掉的呢?过来我们看954行往前翻诶。九百四十五行啊,是调目标方法。954行调的这个post handle后边呢是渲染视图,所以说这个方法是在调目标方法之后,渲染视图之前被调用的。
09:04
这个方法。调用目标方法之后,但。渲染。视图之前被调用好的。还差最后一个after completion。这什么时候掉的呀,走一个。回退。点一下。Prehan。目标方法,Post handle can after completion,什么时候掉的啊?Dispatch。再往前do dispatch,我们看这个呢,是在渲染视图的时候掉的,好了进来往前翻,往前翻我们看到诶。
10:08
1012行呢是渲染视图,所以说这个是在渲染视图之后被调用的。回来。这个呢,是在渲染视图之后被调用的。好了,那这三个方法。具体的有什么用啊,那pre handle在调目标方法之前调用可以考虑。做权限是吧,比方说你做权限,那你要没有权限的话,我就不让你掉那么多方法是个好主意吧,或者是啊日志事物等等等等。
11:06
是。等是吧,在调目标方法之前被调用好了,我们再来看。Post post在。渲染视图之前,我们看到这里边儿,我们是不是有Mo啊,所以说在这里边我们可以去修改请求域里边的属性,或者是修改你要转向的视图,可以对请求域。中的属性或试图做出修改,是这样吧?这个方法呢?视图都已经搞定了,才叫它干什么用啊,就是释放释放资源,哎,就干这个用的好了,这就是我们说的这三个方法,大家还是要好好的去理解一下的。
12:07
再来看一个,看一个图,这个图呢,可以更直观的让我们说一下这三个方法调用的顺序,首先调pre handle,然后执行目标方法,然后调p handle,然后渲染视图,然后调。@。Completion方法,然后执行完成对吧。行以上的话呢,是我们intercept的,Hello,大家把这个来写一下。
我来说两句