00:03
呃,这个哈。这个filter很像我们以前的filter,只不过呢。这个filter哈,你可以认为是它升级了。以前的filter呢,是在我们的一个web应用里边起作用的。那么其实我们以前的一个外部应用就大致上呢,对应我们现在的一个spring boot的微服务的工程。所以说以前的filter是在这个局部起作用的,现在的filter呢,那厉害了,他在gateway里边,它可以对整个的这个项目啊,接收到的请求统一的先做一次拦截和过滤。哎,就是这个filter,它拦截的范围就大了,哎。然后呢,这里边儿有个问题,就是说呢,假设你做一个登录的请求啊,登录的过滤,他这个请求过来以后,你检查他有没有登录。他要是没登录的话呢,你给他跳转到登录的地方去登录。
01:03
这个操作呢,也就是说需要让他从我们getway这个工程,要让他去我们consumer这工程这里边儿不能转发。不能转发。为什么不能转发哈,大家这个转发有一个要求。转发呢,只允许在一个web应用的内部去转发。啊,这是转发的一个要求。他只能在自己工程内部去转,你所转的这个资源必须都得在自己本工程内才行。不能转到外边去。啊,转发呢,其实是一个很私密的一个事情啊。重定向就不一样了,重定项可以让你访问一个新的资源。你从内向到百度都可以的啊,但是转发不可以,所以说呢,你在getateway里边想去做转发,也只能在getway的里边的打转啊,在getway里边去去去去去去。呃,转发到另外一个资源,但你想要去另外一个模块的话就不行了。
02:05
这就不能转发到这儿了,这个只能是重定向到这儿。那这个是,不过这个是后话了啊是吧,咱们先看看这个filter的一个基本的一个用法啊。请求过来,Zoo里边有一个做filter,哎,然后具体的微服。哎,那么具体微服务里边呢,你可以自己再去写拦截器,这个拦截器也只能是在这个微服务里边去去生效,在别的地方是不不能生效的。哎,这个做filter呢,需要去继承一下这个。呃,继承这么一个类叫做filter啊,我们的继承它。然后呢,里边有这么几个方法。我们去。点filter。我们的组。哎,它也必须通过加component componenton注解加到LC容器里边。
03:04
然后呢,让他去继承一下我们的这个zoo filter。哎,这里边儿有几个抽象方法。哎,过来哈,看一下说我们这个。呃,Should filter,咱们一个一个看哈,这个should filter是干嘛用的呢。判断当前请求要不要进行过滤。啊,是否要进行过滤。那这个判断呢,无非是两个结果。哎,一个是这个要过滤,还有一个是不过滤。那你要过滤的话会怎么样呢?就会继续去执行这个run这个方法。
04:00
呃,就继续执行这个run方法。要不过滤呢,就等于说直接放行了。那咋控制它过滤还是不过滤呢?就是看你return是true还是false。你看啊,他说,A true return from this method。Means that the wrong method should be evoked。这。返回处后边就会掉这个RA,这返回false后边就不掉这个。就是起这么一个作用啊。返回处。啊,这边呢,是返回这个false。所以说呢,这个相当于去指定我们要拦截的是哪些个资源。啊,你要拦截的是什么?呃,以前这个东西是我们在配置文件里面配的,现在呢,这个是用这个方法这里边来做的,因为我们这里边。
05:00
呃,他没有设,设计成在在这个压膜里边去配啊,所以说这个时候是就是在这儿。就在这里边去判断诶。嗯。啊,当然当然了,说这个怎么去判断呢。我们想要使用这个,肯定得拿到request的对象才能做相关的判断。我们要是诶的习惯的话,是在这写。但是呢,你要这么一写的话,这边就报错了。它负类里边没有这么一个方法。啊,记住不能在这儿写,他不能这样给你传进来。不能传进来咋办呢?有别的办法哎。这个呢,我们是先获取一下这个request context对象。咋获取呢?一个current context。
06:02
哎,拿到这个上下文。然后呢,再获取这个request对象。哎,得到http request。这东西是咋得到的呢?这个thread local大家有没有印象?Thread local。啊,这个其实相隔略微有一些个久远,对吧。哎,就是说这个叫线程本地化技术。有一个线程。这个线程上面执行好多个方法。我在这个方法里边有一个什么东西,我得传给这个方法。可是他们之间呢?又不是直接调用的关系。不是直接调用的关系。啊是这个反正是在一个线程上面,但是它调不了,它不能直接去调用它,那咋办呢?诶在同一个线程上,那我就把我这个东西呢,绑定到这个线程上。
07:07
哎,然后你在这儿用呢,你也能拿到这个线程,你就从这个线程上面去拿,我我这个东西就行了。所以说呢,用这个对象的S的方法绑定到当前线程上面,叫它的get方法呢,从当前线程上面再去取。这个线程呢,你把它想象成哈,这是一个,这有一条河。哎,这有条河,这个河张义在上游呢,他洗澡,然后呢,他这个不小心内裤呢就飘下来了。画的像不像,挺像,然后王聪呢,正好在下边。他就捡到了。就是何桑义在上游钓的那个内裤。因为是同一条河。同一条河啊,他从河上游它放进去,他从下游就可以拿到。
08:05
有一首诗是吧,叫君住长江头,我住长江尾,日日思君不见君,共饮长江水。没错。啊对,所以说这个这个就是说我们线程本地化技术,哎,你结合这个例子,希望大家能把这个记住,其实呢,我们这个框架哈,很多地方都在用这个。你比如说呢,我们县城在前边呢,这边我们去给他这个那什么一下啊,就是开启了一个事务。这开启十了,我这隔了挺远的。呃,这都掉过好多别的方法了,下边又有一个方法呢,也需要用一个事物,这个事物呢,他又不想开一个新的啊,这他想用原来这个已经开好的那个事物,那我咋能把它给拿到呢?哎,也是,只要他们是同一个线程上面,我们就可以进入这个线程。
09:02
让他从上游把这个数据呢给我们飘下来。只要是同一个线程上面就行,用它的set方法设置,设置上去盖的方法一取就行。啊,所以这个线程本地化技术其实挺有用的。哎,你的请求和请求之间呀。哎,这个请求到这个请求你想传递数据啊,可以使用这个session域啊,或者域啊这样的方式,这个是横向的传递。同一个线程的内部要传数据的话,要不你就是直接调方法,你可以传参,不是直接调的方法,你可以用这种线程本地化的技术。啊,所以说这样的话,我们这个项目里边,你横着传竖着传,这数据就就都能够流动起来了。啊,但甚至于说,我们还可以往回倒。我线程已经执行,就是执行到这儿了哈。我还想往回倒。往回倒呢,就是用抛一长的方式可以往回倒。啊,但是这个到的话呢,你只能往回传一个,呃,Message这样传个消息哈,只能是告诉他出了什么事了,但数据想传就没法往回传了。
10:07
啊,就往回倒的话,只能传一些个消息啊,说我这边出问题了。好嘞,哎,那么我们这儿。过来看啊,就拿到request对象,这个其实是从。呃,他在前面呢,设置到线程上面的啊,他他先获取到这个铝快对象,绑定到县程上面,再从线程上面去取。那么我们可以根据这块立项呢,进行一些个判断啊。嗯。比如说呢。判断哈,这个当前请求。请求参数啊。请求参数啊,是否为这个signal。嗯。就这样吧,这个就直接返回这个判断的结果啊。request.get per。
11:02
它返回一个参数啊。这个参数呢,咱们去看一看是不是hello。如果是的话呢,就让你过去啊,就就就就可以不不过滤,不是的话呢,就要去过滤一下。就是这个树的filter这个方法。下边这个run呢,就是说过滤了以后啊,如果这个是要过滤的,在这里边儿呢,进行一些个操作。比如说呢,咱们这儿就打印个日志就完事了哈。Logger。False是放行。啊。啊处是过滤是吧,啊,那就是等于这个就是要对等于它就是从从这进来哈。啊,对。To return means that啊对,返回处是调转,对,那就是返回处的话继续执行。哦对,那我刚才说白了哈,它相等的话就来执行它啊,我说白了哈。
12:16
然后这个里边我们去log,咱们去打印一下,这个叫做那个info。哎,当前请求。要进行这个过滤。这个我们run。方法执行了。这个,然后这边这个返回值咋弄呢?看一下啊。关于返回值,Some arbitrary artifact may returned current implementation ignore this。前半句话是废话。看后半句话,当前的实现会忽略它。就是说我们现在这个事儿,其实现在这个环境吧,现在这个版本来说,就不要这返回值这个地方就返回到去了,不用管它。
13:05
啊,这个地方不用管它啊。我们就把它官方文档这里边儿这句话放在这儿啊。这是我们的依据。CTRLC啊。说这个是这个,呃。嗯,哎,就是说当前实现。会忽略。呃,这个方法的返回值。哎,然后呢,嗯,所以所以返回闹啊,不做特殊处理。哎,就是说这个这个是我们从官方文档找的依据啊,将来大家上班以后呢,也是哈。嗯,有一些个就是别人口头跟你说啥哈,其实你。呃,特别是别人口头上答应你的事儿。你就不要太当真。因为你没有证据。
14:01
你你跟他将来说你这个,你当时你答应我了。他说,你你,你有啥能证明我答应你了?你没有证据是吧,哎。你说我随时带个录音笔啊,那你这个挺得罪人的,这个。别人如果知道你,你别人如果知道你这个带着录音笔哈,时不时的还录个音的话哈,还要留个证据的话,别人就不太想跟你说话了,谁也不敢保证自己答应的事都能做到啊,所以说别人口头上告诉你的,你也留不下什么证据的东西呢,你就这个要多个心眼,就这个东西呢,他答应你的事,你也不要太当真。他这个比如说答应给你加薪啊。对,就是说,然后就是说这个别人给你一个大活,或者说一个挺,哎,挺负挺挺挺责任重大的一个事儿,这事要干砸了以后,你这边得,呃,对你来说挺严重,对你来说挺有危害的。啊对,会挺挺影响你的发展,这种事呢,你最好让他给你发个邮件呀,或者最起码是你让他微信呢,给你发过来,你微信里边聊天记录,你自己截个图。
15:04
保存一下,你这你这个事儿你肯定不用不需要跟任何人说,但将来将来将来真要是扯皮的话,将来他要别人要拿这个事儿要指责你的话,你把这个拿出来,你看是当时是这个哪哪哪哪个头,他让我这么干的。啊,就是留一个证据,就在职场当中呢,我们也要去去,呃,保护自己对吧啊。嗯,然后这个run方法呢,就是前面过滤就走它哈,下边还有一个filter type,就是这个过滤器的这样一个类型是什么哈。呃,有这么几种类型哈,这个有一个P,就是在你走到那个微服务的前面的时候执行它。还有一个post是在它的后面,Error是出错的时候啊,这个root呢是for an orange。这个给一个原始的进行路由,这个我也其实不是特别理解,他这话啥意思啊。
16:02
那我们通常的话就是过滤呢,通常90%的操作是在他之前做。啊,这是在它后边做啊。这是出错以后,所以说呢,我们这儿就是说,呃,这返回什么。这返回什么,哎,这个过滤器呢,就在什么时候执行,这个run方法就在什么时候执行啊。这里边儿这个string,我们来一个filter。嗯,Type,哎,咱们就设置一个pre啊,咱们基本上用的就是。嗯,哎,然后这个就是。返回当前过滤器的类型啊,去决定。当前过滤器啊,在什么时候执行。表示。在目标微服务。前执行。
17:01
Filter order呢,这个也没什么用,这个就返回零就行了,这个就就不用管它了啊这个。Must also be DeFined for filter必须定义filters must have the same filter order。If procedure is not important for a future。Future orders do not need To Be sequential。也不是太明白他这话是啥意思啊,反正这个地方就不用管它了啊,这就返回这个零了。这个写好了以后呢,写好了以后它会加到LC容器里边。啊,有这个注解,结合这个包扫描的机制,加到FC容器里边,它加到FC容器里边它就生效了。哎,所以说这时候把做重启一下。我们现在访问这个请求哈,它会在这个呃,Signal啊,然后咱们根据这个呢,去决定它是不是能够被过滤。
18:09
哎,好嘞。呃,这个咱们。怎么样啊?这边清空。这边缩小一点。刷新一下。这打印的挺多啊。Initial initial。A sleeping。咱们找点关键的哈。Li。呃,这个。Balance。没看到一个正经的呀。这边。我们现在这个版,我们现在这个东西呢,是属于按照这个参数来说呢,是不过滤的。无过滤的啊,所以说这个就没有,我没有在我们院里边那个打印。呃,这如果是hello的话。
19:02
Hello的话就是有my filter里边会有一个打印啊,要进行过滤,让方法执行了啊。这就是这个。呃,做啊,这个网关的过滤的一个效果啊。我们在咱们后边做众筹这个里边哈,也有会员的这边登录的一个检查啊,分布式环境下边各个模块在访问之前都要进行这么一个检查,那么就是我们就可以用这个做filter啊,来做这样一个登录的检查。
我来说两句