00:00
好,前面呢,我们说了一下spring boot底层在处理这些web请求的一些原理,那接下来我们来说一下我们以后在web开发期间常用的一些功能,我们先来说一下拦截器,我们还是以我们的这个后台管理系统为例,们当前的这个后台管理系统呢,啊,我们随便使用一个账号密码登录进来,那只要我来访问任何请求,那就应该是我们登录以后才能访问的,但是我们目前呢,写的这个方法就是只有我们做了这个慢页面的这个登录检查,然后你像去我们后台管理系统的这个主页的时候,我才看你有没有登录session选中,有没有其他的我们都没做,挨个要去像慢延面这么来做肯定很麻烦,所以我们可以使用拦截器机制来完成,或者呢,我们使用我们原生so的filter机制,我们也可以,那我们就来说一下拦截器机制,拦截器呢,在我们底层是这么一个接口,叫handler intercept,这个handler intercept,我们来看一下接口定义的这么几个。
01:01
的方法,这几个方法呢,其中第一个叫pre handle,那翻译过来呢,就叫预先处理,什么是预先处理?我们现在呢,比如随便发一个请求,按照这个请求路径,我们最终相当于要找到我们的handleler进行处理,就是我们写的这些ctrler,那处理完以后呢,又要跳转一个页面,然后呢才能完成所有工作,而我们的pre handle指的就是在我们这个目标方法处理之前,我们在这来进行处理,所以呢,这个位置它呢叫pre handle pray handle,然后呢,再来接下来我们这个目标方法处理完了以后,我们还没到达页面之前,我有可能呢,想要给页面提前再放一些数据,可能要用,所以呢,这个位置会又有一个拦截点叫post handle,所以呢,我们可以在目标方案执行完以后,我们再来使用拦截器的post handle动方法来进行后置拦截,然后呢,等我们的这个页面配置真正的渲染完了以后,我们有可能还想要做点什么清理工作等等,我们还可以使用这个after。
02:01
Comp,然后我们整个请求处理完成以后,我们又怎么做,所以呢我们可以在这个节点位置,我们又有一个after这个拦截点,所以呢我们spring mvc给我们设计了咱们这个拦截器的四个位三个位置,那么就来使用它来做我们的登录检查功能,我们现在来创建一个这个,我们还是放在intercept这个包下,我们就叫log intercept这这个拦截器的这个作用就是来做登录检查,登录检查然后呢,它必须实现我们说的这个叫handler interceptor这个接口,这个接口呢,这三个方法我们写过来,一个叫pre handle,这个呢我们先之前给大家说了,这是我们这个目标方法执行之前,目标方法执行之前,然后呢,我们还有一个方法叫post handle,这是目标方法执行完成以后啊,目标方法执行完成。
03:01
后,然后呢,接下来还有一个叫after completion,这个是啊,我们这个页面啊,页面渲染后,好,那现在呢,就是我们这么几个位置,那首先呢,我们所有的登录检查就应该写在pre handle的位置,那如果你没有登录,我呢就相当于不给你执行目标方法,不跳转到页面,所以呢,我们就可以在pre handle的这个方法,这我们可以来写上我们的登录检查逻辑的登录检查逻辑,而这个逻辑呢也非常简单,我们拿到原生的request对象可以get session,拿到这个session,拿到这个session以后呢,我们只需要做的一件事就是session get tribute,来看session里边有没有放已经登录的这个用户,如果放了好,我们也不管这个用户是谁登录的,张三李四我们都不管,只要这个用户不等于空,也就是说呢,我们当前是有登录的用户的,那我们就可以给他return。
04:01
所谓的return处,那就是放行,而否则呢,那就是把它拦截住,所以呢,这就是我们说的拦截器,那我们这个拦截器什么时候要工作,所以我们这个拦截器写好它该怎么工作,我们要写三步,第一步我们要配置好咱们这个拦截器要拦截哪些请求,然后呢,第二步把这把这个配置呢,把这些配置,把这些配置放在容器中,也是说把拦截器的这个配置放在容器中,因为我如果我们使以前我们想要配置拦截器,我们使用的是一大堆一大段的这个插麦配置啊,我们说这个拦截器来哪些路径,该怎么做,所以我们现在呢,还是这个步骤,那我们以前说的对spring m VC,所有的定制化操作,我们都可以这么来做,所以我们来写一个这个conflictfig,我们呢,就叫我们的admin web conflictf,好,我们就叫这个。
05:01
这类呢,我们现在相当于要定制STEMMVC的一些功能,那么就首先告诉他这是一个configuration,然后呢,它必须实现我们说所有定制web功能的,我们都是使用这个web mvc config这个接口,然后这个接口里边呢,我们点进来它的这个设计里边,我们可以往下翻,其中呢就有一个叫and interceptors,所以我们拦截器要工作它的啊两点,首先这个拦截器得在容器中,而且呢,把拦截器呢得放在我们这个啊,我们来这个叫and interceptors,我们得配置进来,我们在这个registry,相当于我们整个拦截器的这个注册中心里边,我们点一个and intercept,相当我们要添加一个拦截器,添加哪个拦截器呢?我刚写了一个叫log inter,我们相当于添加这个拦截器,添加这个拦截器以后呢,下来它还可以式调用方法,第一个叫and pass pattern,这个and pass pattern就告诉我们要拦截哪些路径,那我写一个杠双形,那这个。
06:01
刚才就是默认干嘛默认拦截我们所有的请求,但是呢,我们这两个要默认放行的,我们可以看一下哪个呢?一个就是我们的这个,呃,去登录页的这个杠,或者这个login,这个呢是去登录页,而且呢,账号密码一填以后,我们要登录,因为这两个呢,即使你没有登录成功,我们这两个是一定要所有人都能访问的,所以我们要放行,所以我们在这必须配置上它放行哪些and呢,是添加我们要拦哪些,其中exclode,那就是我们要放行哪些,把要放行的这个我们复制过来就放行这个,但除了放行这些呢,我们可以看一下,我们这个配置呢,已经在这儿,看能不能生效,那先启动起来走,我们这个拦截器的方法呢,也写好了,你只要登录了,我就给你放行,否则呢就给它拦截住,我们可以看一下拦截柱跟放行都是什么样的效果,我们先来看一个拦截柱。好,我们随便来访问一个basic table,现在呢,相当于我们当前呢,没有登录,我们随便来打开一个新的这个浏览器,我们可以打开这个啊edit这个新的浏览器,来访问一下local host local host8080,好,我们来看一下啊,我先来访问一下,它走回车,哎,我们看到一片空白,一片空白的原因那就是拦截住了,所以呢,一旦拦截住以后,我们这一块呢,其实还要写一个逻辑,就是呢,我只要把你这拦截住,相当于呢,就是未登录,未登录,那未登录呢,我们自然就应该跳转到登录页面,那么最好呢,给它跳转到登录页,所以呢,我们这个跳转到登录页,那当然这个呢,其实就好做了,我们想要去登录页,那我们就来这么来做啊,我们可以让它response啊,Response第2SEND redirect对吧,Send redirect,我让他重定向,重定向的哪个页呢,我直接告。
07:56
就是代表当前项目下的这个首页,当前项目下的首页就是这个登录页,而且呢,这个登录页里边我们其实又能取出错误消息,比如我们这个登录页里边呢,又有一个这个message这个消息,所以这个message消息呢,我们也可以给它放到这个呃里边,我们因为我们是重定向去了登录呀,所以呢,我们可以给session里边把这个message消息放一下,哎,我们呢就叫message这个呢,我们叫请先登录,好请先登录,这个呢,相当于我们就写了这个拦截柱的逻辑,好我们来重新启动一下。
08:35
我们可以看一下效果。是什么样的效果,就说呢,你只要没登陆,原来呢是一片空白,但是没登录呢,真正要去登陆页,我先来回车,好,我们看到呢,他来到了登陆页,他来到登录页呢,大家会发现这有个问题,就是登录页的所有的这个样式好像出问题了,那我们就猜想拦截器呢,可能不止把我们所有的这个动态请求拦了,因为我们这个拦截器杠双新式拦截,所有放行了杠和杠log可能把我们所有的静态资源访问也拦了,我们随便拿登录页的一个静态资源访问,比如它叫CSS下的style,我们看一下能访问它吗?那就直接来到这个页面来要访问这个静态资源回车,诶我们发现访问静态资源也是来到登陆页,所以呢,大家一定注意,我们这个拦截器呢,只要我们配了杠双星,那就是拦截,所有我们把静态资源也会拦截,这种情况下呢,静态资源那么在这儿一定写上,除非你精确拦截你我们不可能精确拦截把这个basic。
09:38
Table,好,我们配在这,哎,我们说我们要拦哪些路径在这配一个basic table,我们系统里边有100个防问请求,我们都配在这,这样很麻烦,所以我们都配的是杠双星,这种方式呢,就是静态所有请求都会被拦截,所有请求都被拦截,包括包括包括咱们的静态资源,而我们在这儿呢,相当于是放行的请求,我们这两个呢不难,所以只要发这两个请求会不用经过拦截器,包括我们可以来验证一下拦截器是不是拦了静态资源,哎,我们在前面呢,已经验证了,我们甚至可以打日志这附接,我们直接在这呢打印一下,只要他把哪个请求进来来了,你就在这,log.info这个拦截的请求路径是是哪个呢?我们可以来获取一下请求路径request get,获取一下request uri,获取一下我们当前的这个请求路径。把这个。
10:38
路径呢,那么这个日志打到这好来重新启动。这三方间呢,是我们之前说的龙bank给我们提供的快速功能,哎,给我们能拿到这个日志对象,好,我们现在来访问一下,我呢假设我来访问登录呀,我来回车,大家会看到我控制台打印的呢,会很多,看我们这些静态资源其实也难了,而静态资源呢,我们现在没登录,所以呢我们现在没办法拿到静态资源,那么现在呢就必须放行,放行呢怎么放,所以我们在这exclude里边好说,因为所有的这个静态资源它都在static文件夹里边,我们现在呢有两种办法,第一种所有的静态资源如果访问CSS肯定有CSS前缀,如果呢访问GS肯定有GS前缀,因为要访问这个静态文件夹下,我们又带了一层文件夹,所以呢,我们可以在这这么来写,来把CSS下的所有东西我们来放行好,这是一个放行的,然后呢,第二个我们再把我们这一块,还有一个叫我们的这个字体文件下边的放行。
11:52
它下边的所有请求要放行的,然后呢,还有我们的这个图片下的所有请求我们要放行的,另外还有我们这一块有一个GS下的所有请求,我们要放心的,这是第一种办法,如果呢,你这个静态资源文件夹下的东西太多,你先写第一种办法麻烦,那们还有一种办法就是呢,因为我们可以配置静态资源的访问路径,Static前缀路径,那前置路径呢,比如我加一个static,这样呢,以后访问任何的这个静态资源都必须呢,在这加加一个前置的static路径,那我呢,以后就来static下的所有,但是如果我要用第二种这个方式来做的话,太麻烦了,我们把每一个页面呢都得改,所以我就用第一种方式,我们就让他把CSS下的啊,这些下边的所有资源我们来放行,放行了以后我们来看一下效果。
12:58
好,我们现在来看一下我们的这个效果,我现在来推车,好来到我们的这个登录页没问题,如果我们要访问其他页面,因为我们以前呢,只给慢页面做了这个登录拦截功能,所以我把这个慢页面呢,甚至于我都可以给它去掉,我把这个慢页面呢都直接去掉,然后呢就让它return慢,因为我们这个登录检查呢,已经在我们的拦截器位置做了,所以我们放心大胆的访问慢页面,来看一下是啥效果。
13:36
来回车这个呢是登录页没问题,如果我们来访问慢页面,因为我们没有登录,所以按照拦截器我们已经来到这儿了,只不过呢,我们现在取不出我们的这个消息,取不出消息呢,因为我们是重定向啊,我们来看一下啊,因为这个拦截器规则在这儿,拦截器如果我们没有登录,我们当前呢,相当于是访问慢,访问慢呢,它被拦住了,因为它呢没有登录,所以呢我们给session里边放了一个,然后重定向到这儿,那我们这个重定向呢,它可能取不出东西,所以呢,大家可以用这个request,我们给请求域中放,然后呢,我们让他转发request,那就能取到东西了,第二。
14:19
Get request dispat啊,我们拿到转发器就直接给我转发到当前这个请求,这个请求下边呢,Forward,把原生的request response我们都转过去。只要我们请求域中有这个值,那么就能获取到了。可以看一下最终的效果。好,没问题,然后呢,我们来看一下,我们现在来直接访问慢页面,我们没有登录回车,好它提示我们请先登录,然后如果我们来登录成功了,123456走登录成功以后呢,来访问任何其他页面,好大家看啊,来访问这个basic table basic table呢可以访问,而且我们拦截的地址好没问题,然后呢,大家说诶这一块静态资源为什么没打应我拦截的请求是谁?因为我们在这已经配置了,把静态资源都放行了,所以呢,我们自然就不会在这个拦截器里边打印,因为我们都放心了,然后呢,接下来我们的这些所有的请求都可以访问了,这就是我们说的这个拦截器,拦截器的使用呢,总结起来就这么几步,第一步编写一个拦截器,拦截器实现我们的handler intercept接口C这个接口,然后呢,第二个,然后呢,把这个handle编写的拦截器拦截器,然后呢。
15:42
注册到咱们这个容器中,整个的这个注册呢,是通过这种方式注册的,所以呢,我们相当于它的注册方式是实现web这个mvc confi的and intercept方法,然后呢,接下来唯一注意的一点就是第三点目们要啊指定咱们这个拦截规则,而这个拦截规则里边呢,特别注意一点就是静态资源,如果是拦截所有,如果是拦截所有静态资源也会被拦截,当然你在这儿指定精确拦截了,那我们就呃不用管这个静态资源问题了,好,这是我们说的这个拦截器功能,那拦截器的这个其他功能我们可以看到,只要我们执行成功以后呢,这也有POS啊,POS handle动,这个POS handle动呢,我们一定要确认这是什么时候执行这一块呢,是在目标方法执行之前,我们可以以一个页面为例,比如我们就以这个慢页面,我们这个慢页面呢,我们只要慢页面。
16:42
行了,我们可以打印一个日志。我们在这儿log log点英符来打印啊,当前方法是啊是哪个呢?我们来打印一下当前方法,就是我们的这个慢慢方法来传入我们的这个参数值,好,当前方法呢,是咱们的这个manage这个方法,我们接下来就来看一下拦截器的这些呃东西,它都在何时执行,首先呢,拦拦截请求的路径pre handle,我们会打印拦截请求的路径,我们再在其他地方,然后呢,我们打印一下post handle,啥时候执行post handle。
17:28
而且post handle执行了以后呢,我们还能看到这个东西啊,这个里边呢,有一个这个叫model and view,哎,我们不妨可以把model and view这个对象呢打过来,然后呢,这是post handle post handle完了以后呢,还有一个after completion,我们可以看一下它是什么时候执行,呃,那这个执行完了以后呢,哎,如果有异常,我们也可以打印一下异常执行出有执行的异常,当然没有异常这一块自然打印为空,我们可以来在最后看一下整个拦截器的执行流程和效果。
18:08
那么现在拦截器的功能一切是正常了,如果我来访问咱们的这个慢页面,慢页面来回车好,没有登录请先登录,我们现在来看一下,来登录一下123456走登录好,现在呢,我们访问慢页面们来看一下我们这一块的打印,这一块的打印呢,好,我把这一块呢全部去掉,我们来重新访问一下慢页面走,然后我们来看一下控制台的打印,首先呢,Pre handle拦截的请求是慢HTML,哎,我们当前方式是慢配,哎,当前方法啊,我们打的是错的,所以呢,相当于我们先是pre handle执行,说我拦截的是这个路径,然后呢,再是我们的这个目标方法执行,然后呢,最后目标方法执行完了以后,再是我们拦截器的这个post handle,哎,在这执行啊post handle执行以后呢,把我们整个model and view,我们要去哪个页面,以及这个页面里面有啥内容也打印了,哎,我们在这儿没问题了啊,所以呢,我们整个的请求执行路径就是这样,然后。
19:09
后呢,接下来他在这呢,又有一个拦截,我们看啊,还是我们的这个慢HTML,相当于呢,我们这个请求给发了两次,发了两次,这可能是我们浏览器的原因,当然我们现在呢,看到浏览器的啊,我们的浏览器在我们这个拦截器的整个执行过程就是先pre handle,在目标方法再post handle,最后呢,After completion。
我来说两句