00:00
好,那下面呢,我们就来看一下这个spring VC中的拦截器该如何配置啊,首先呢,它是属于咱们spring VC中的一个组件,所以说咱们肯定是要把它配置到spring Mac的配置文件中的。你像是我们服务器中的组件,像咱们的过滤器,对吧?然后这个东西咱们就要配置在web的XL里面,那下面呢,咱们把它的配置文件给打开,大家注意,咱们需要怎么来配置呢?咱们所使用的标签叫做MVC冒号intercepts,那咱们从这个标签的名字上就可以看出来,它可以来配置多个拦截器。复数标签嘛,对吧?好,然后大家再来看里面呢,它一共是有几个呀,一共有三个子标签,首先第一个呢,叫做B啊,然后这个B呢,其实很简单,就跟我们平常配置那个B是一样的,然后它主要就是把咱们当前的某一个类型呢,来配置为一个拦截器,大家看一下啊,然后这里面呢,Class就是来写这个类的类型的,然后ID,然后我们来给它起一个唯一标识,然后但是呢,咱们这里面这个拦截器啊,它是由我们的spring VC,然后来加载的,所以说呢,咱们并不需要设置ID啊,只需要呢来设置一个class就行,然后下面叫做first intercept OK,这样就可以啊。
01:19
好,大家看咱们这样就设置完了,然后设置完之后,我们现在咱们再来一个重新部署。大家来看一下它有没有这个效果啊,首先呢,然后咱们在这把这些东西都给它清空掉。好,然后我们现在咱们再来一个刷新,然后大家会发现一个问题,就是什么问题呢?我们页面里面这个index的HTML没有了啊。对吧,然后我们再来看idea的idea的控制台,然后大家看一下啊,你看这个地方,然后呢,我们当前咱们的拦截器中的普handle方法执行了,但是呢,咱们下面的这个post handle和after completion,然后这这两个方法是不是都没有执行,对不对,那这是为什么呢?大家来看啊,大家有没有发现咱们的pre handle这个方法有返回池,而我们的这两个方法呢,它是没有返回值的。
02:11
对吧,那这个方法的返回值是用来干什么的呢?因为咱们说的pre handle在什么时候执行,它是在我们当前咱们的这个控制器方法执行之前来执行的,所以说呢,这个pre handle它就起到了一个拦截的作用,如果说我们返回false的话,然后来表示的是拦截,那我们的控制器方法它就不执行了,然后如果我们当前咱们的控制器方法,咱们的pre handle返回的是true的话,表示的就是放行,OK吧,这个其实我们从源码里面咱们也可以看出来啊,比如说我们在这咱们先简单的看一下,咱把它给打开,然后来找到我们当前的1061行来,大家往下看啊。1061好。来大家看,然后这是1078,然后这个是1061对吧,然后大家往上看,咱们在这儿呢,然后大家会发现一个方法叫做map,叫做map的handler,然后点a apply pre handle,大家注意这一行呢,就是来执行谁的,就是来执行我们当前咱们的拦截器的pre handle方法的好,然后大家会发现这个方法呀,然后它在调用之后呢,会有一个返回值,对吧,然后大家看,你看这是啥意思,如果说我们当前咱们这个方法返回的是false。
03:28
那它这个if附条件是不是就成立了,成立了之后在这咱们是不是就直接return了,那下面的这一段代码大家看他还会执行吗?是不是就不会了呀,对吧?这一句话是什么?大家应该都知道,这就是来调用我们的控制器方法的这一行代码,对不对,1061行嘛,对不对,咱们之前就看过好多次啊好,然后所以呢,大家看好了pre handle方法呀,然后它的这个返回值来表示的就是拦截或放行的功能,其实也就是来拦截我们拦截或放行我们当前控制器方法的一个执行,OK吧,所以咱们现在为什么你的页面呢?然后它是空白,就是因为我们当前pre handle执行完之后,它返回的是false,所以说咱们从源码就能够看出来,下面的代码是不是全部都不再执行了,对不对,所以说啊,然后我们现在呢,把它设置为true,然后方便我们去观察这个效果啊好,下面咱们再来一个重新部署。
04:29
好,然后咱们把这个控制台呢,然后给它清空一下,然后我们现在咱们再来一个刷新,大家看是不是就有了,对不对?好,然后我们现在咱们再来看,这里面输出的信息比较多,那我们再来一个刷新,大家再看啊,你看这三个方法是不是就都执行了,对不对?好,那比如说我们现在咱们再来测试这个拦截器,然后我们现在咱们点击之后,然后大家看,然后在这个位置,这三个方法是不是也都执行了,OK吧,行,所以大家一定要看好啊,这个pre handle方法的返回值呀,然后它来表示的就是拦截或放行的功能,那这个呢,咱们一会儿再写,然后咱们下面咱们接着往下看,咱们的这个其他的配置方式。
05:12
比如说这个东西咱们是通过一个并标签来配置的。那我们也可以来怎么进行配置呢?这里面还有第二个标签,叫做ref。然后这个ref大家都知道是什么意思,叫做引用。我们之前咱们在讲这个叫做这个基于叉苗,然后来管理病的时候,对吧?然后当我们来为一个病标签中的这个类类型的属性来进行赋值的时候,咱们用的都是ref,所以说ref来表示的是引用,那我们现在咱们要来配置一个拦截器,其实主要就是来将我们当前的某一个类型来设置为一个拦截器,那这个时候咱们怎么做,其实咱们只要来引用某一个病就行。比如说ref中有一个bin这个属性,然后这个B里面来写的是啥来写的就是我们当前咱们要设置为拦截器的这个bin的ID,大家看multi part的reserve从哪来的,这不就是我们上面咱们所配置的文件上传解析器吗?对不对?所以说我们现在是要把它,然后来设置为来引用为一个拦截器,那所以说咱们是不是只需要来引用它的病就行?
06:23
来引用这个病in的ID就可以,但是咱们现在的这个spring MC的配置文件中有没有去配置它呀,也就是spring m VC所对应的IOC容器中有这个B吗?没有,那所以大家是不是就有了两种方式,我可以在这然后来设置一个B,然后它的ID咱们可以叫做啊,或者说咱们先来设置class,叫做first intercept,大家注意我这是在我们当前MVC冒号intercepts,然后在它外边所设置的,能看懂吧,好,然后这个咱们就叫first intercept,那这个时候大家说我们是不是就可以直接将我们当前咱们的拦截器所对应的B,然后来设置为一个拦截器了,能看懂吧,这个大家注意,咱们可以这样去写,或者说我们也可以怎么办,咱们把这个标签啊都给它干掉,然后我们可以把它通过注解加扫描的方式,然后来配置为一个病。
07:20
比如说在这咱们来设置一个,因为它不是控制层组件,也不是持久层,也不是咱们的service层,对吧?所以说我们直接给它标识为一个普通组件,但是呢,咱们通过注解来管理病的话,除了要加注解之外,我们还要来扫描,但是我们之前咱们扫描的是不是只有咱们的控制层啊,对吧?所以说在这大家看好啊,咱们把这个点C去掉,然后这个时候咱们再来找到这个标签来使用ref,然后B大家看first intercept是不是也有啊。这个大家能听懂吧,知道为什么会有不?因为我们通过注解,然后来管理的并它的ID有一个默认值,就是我们当前咱们的类名,然后所对应的小驼峰。
08:07
大家说是不是OK吧,所以大家注意,这是咱们的第二种方式啊,好,下面我们在这咱们再来一个重新部署,然后大家来看它该有的效果还是会有的啊,这是咱们当前的两种配置方式,当然呢,这两种大家也能够看到,其实part是对我们当前的什么,它是对我们当前咱们dispat solve所处理的所有的请求来进行拦截的,例如说我们刚才咱们所设置的什么,我们所设置的这个咱们所访问的这个首页,包括我们现在咱们所访问的test的斜线,Hello,对吧,然后它是不是都会对它进行拦截,对不对,然后现在咱们来把它清空,然后下面大家看咱们来一个刷新,然后大家看一下啊,然后这里面的东西比较多啊,再清空刷新。大家看是不是就有了,对吧,然后我们现在咱们再来访问这个什么测试拦截器,然后大家看这里面这三行是不是也输出了,对不对,对吧?好,然后呢,比如说咱们随便来写一个,我在这再写一个斜线,叫做ABC,然后一个回车,大家看404,肯定是404,因为咱们当前spring VC来处理这个请求的时候,没有相对应的控制器方法,对不对,好,所以说大家看404,下面呢,我们再来看,大家看这三个是不是也有啊。
09:25
对不对,有同老师,那找不到资源,他还有吗?对吧,大家注意他找不到资源,那我们现在呢,咱们的拦截器它是它是在我们,它是在咱们的源码里面,肯定会执行的代码,对不对,对吧?然后所以说这三行不管我们当前的资源有没有,不管我们当前的控制器方法有没有,大家注意这三个方法都是会执行的啊,就像是我们的过滤器一样,你的过滤器它知不知道你当前你的这个浏览器所所发送的请求,所访问的资源存在不存在。不知道,所以说咱们的过滤器它该执行还是要执行的,因为它就是在我们程序执行的过程中,这是一个固定的过程,对不对,好啊行,然后大家来看,所以说呢,咱们在这来写一下,然后咱们当前的这两种配置方式啊,那我们在这来写以上配置方式啊,或者说这样吧。
10:21
好,然后咱们的并标签,然后和啊,然后ref标签,然后所配置的拦截器,拦截器对吧,然后默认,然后对咱们的dispatch of处理的所有处理的所有请求,然后进行拦截,进行拦截,OK,这个大家看一下啊,然后对dispat of that所处理的所有的请求进行拦截啊。好,那我们在这咱们还有第三种配置方式,然后叫做什么叫做MVC冒号intercept,大家注意这种配置方式的话,它就更精确一些了,比如说你看咱们在这呢,大家看好了MVC冒号mapping,然后pass,这就是我们当前要拦截的路径,比如说我们在这儿可以写个杠星。
11:11
对吧?大家注意啊,咱们写的杠星,然后它表示的是所有吗?我们配置过滤器的时候,杠星来表示的是我们当前工程下所有的资源进行拦截,那我们在这写个杠型,它表示的也是所有吗?那咱们不知道,咱们就测试一下呗,是不是好?下面大家再来看,你看它除了有这个MVC冒号mapping之外,它还有什么叫MVC冒号exclude mapping。大家注意啊,你看这个是干啥的,这个叫做exclude,叫排除,我们之前咱们在讲这个扫描组件的时候,咱们是不是就讲过排除扫描对不对,对吧?然后所以说这个就是来排除我们对当前某一个资源进行某一个资源的拦截,Exclude mapping,然后比如说咱们在这来写个斜线ABC,大家看,然后这个时候大家注意,那我们当前浏览器如果发送的请求是ABC的话,斜线ABC这个时候会被拦截器进行拦截吗?不会啊,好,下面呢,我们再往下,为什么它还报错呢?大家想一下,你连它拦截的规则你都设置完了,但是他知不知道要用哪个拦截器啊,不知道,所以说你看这里面是不是就这四个标签,这是设置拦截的规则,这是来设置排除的规则,这是来引用我们当前的某一个B来配置我们的拦截器,知道不?那下面呢,咱们就直接用ref呗,然后这里面是B,然后first。
12:38
Perceptor OK,大家注意,这就配置完了,所以说这种呢要更精确一些,咱们上面的这两种它都是默认,然后来为我们当前dispatch of所处理的所有的请求来进行拦截的,好,下面呢,我们进行测试,大家看啊。好,然后我们也是,然后把咱们当前咱们的控制台呢给清空一下,然后我们现在呢,咱们再来一个访问首页,大家看你看咱们的拦截器有没有功能,你看这一句话输出了,那肯定就是没问题的,对不对,对吧,所以说现在咱们的这种朋友这种配置方式也是没问题的啊。
13:19
好,然后但是呢,你看我在这我再写个ABC,因为咱们的斜线ABC就是从上下文路径下来访问的ABC,对吧,好一个回车404,然后下面大家再来看,你看这个地方还有没有输入我们当前咱们的这个拦截器的三个方法,有没有执行,拦截器的三个方法没有,为啥?因为我们在这把它给排除掉了,OK吧,好再说一遍,你哪怕我们当前咱们的这个请求路径请求它没有匹配到控制器方法,拦截器的三个方法仍然会执行。能听懂不好,下面呢,我们再来看,那大家看一下,你看这个请求会被拦截吗?来测试拦截器它的请求路径,大家都知道是斜线T子的斜线哈,那所以说我现在我通过超链接来访问这个请求的时候,大家看大家看啊好点击,然后我们下面咱们来往下看,大家注意诶,大家会发现这里面有没有那个什么呀,有没有咱们的拦截器的三个方法执行的过程中输出的内容有没有没有,为啥呢?大家看这啊,这个杠星在这里面呢,它表示的并不是所有的来,并不是我们当前咱们所有的请求,这个杠星来表示的是我们上下文路径下的一层目录的请求,也就是说只有杠,然后只有在我们当前咱们的上下文路径下只有一层路径的时候,它才会不是。
14:46
然后咱们的拦截器才会进行拦截,比如说啊。我写个test,然后下面咱们来一个回车,然后下面大家再来看,你看咱们在这咱们的拦截器的三个方法是不是都执行了,对吧?然后但是如果我们写的目录有多层的话,然后斜线A对吧,斜线A,然后一个回车,大家看这个时候有输出那三个输出语句吗?有执行那三个方法吗?没有,所以大家看好这个杠型只能来表示上下文路径下的一层目录的路径,然后我们现在要想来表示我们当前这个所有的请求的话,怎么写,应该写个杠星星。
15:26
啊,这个大家看好啊,这里面比较特殊,应该写的是杠星星啊好,下面我们在这咱们再来一个重新部署,大家看。好,那现在呢,那不管是我们当前咱们的上下文路径下的几层目录的请求,然后它都是可以处理的,来现在咱们直接刷新页面,然后大家看是不是就有啦,然后下面咱们再回到咱们的首页,点击测试拦截器,然后大家看来找到咱们的这个位置,大家看一下有没有,这是不是也有了,对不对,好啊,Post handle,然后在这个地方应该是咱们的来往下啊。
16:06
啊,东西好多,好大家看在这个地方中间都是咱们输出的一些日志信息,知道吧?好大家看在这,然后after completion是不是也有了,或者说咱们直接把它给干掉,然后咱们再来重新刷新,然后下面大家看一下OK吧,好,所以说大家看啊,然后咱们的三种配置方式,第三种配置中,然后咱们配置的更精确一些,然后咱们可以通过MVC冒号mapping,然后来配置我们需要干什么拦截的请求路径,然后这个呢,咱们需要可以来设置咱们排除咱们不需要拦截的请求路径,对吧?然后这个是来配置我们当前的拦截器,那在这呢,咱们把它给写一下,好,然后这个是用来配置谁的,来配置咱们需要拦截,需要拦截的请求的请求路径,对吧?记好,这里面有个重点,就是咱们的杠星星,然后表示所有请求。
17:06
OK吧,杠星可不行啊,好在这大家注意,然后这个咱们是需要来配置什么配置需要排除,然后拦截的请求的请求路径,OK,然后再往下,然后这个是用来配置谁的,来配置咱们的拦截器的,然后来配置拦截器OK啊。行,大家注意三种配置方式啊,然后你用哪一种都行,如果说咱们没有特殊的要求,然后来排除我们当前对哪些请求的拦截的话,大家直接用最简单的并或者ref就可以知道吧,但是如果我们当前对咱们拦截的请求要求很高,然后咱们有需要拦截的,有需要排除拦截的,那咱们就用这个MVC冒号intercept就可以啊,OK。
我来说两句