00:00
通过前面的学习,我们知道。拦截器在抓图里面是一个非常重要的组件,多个拦截器呢,可以构成一个拦截器站。在action调用action。跟目标方法之前,它会逐一的调用拦截器,这些拦截器帮我们完成了很多功能,比方说。验证。类型转换等等等等。当我需要一个新功能的时候,我可以向这个拦截基站,拦截基站里边加入一个新的拦截器,比方说我们上节课学的那个。呃,解决表单重复提交的token或者是TOKEN3拦截器,如果我要是不需要某一个拦截器的话,我给你拿出去就可以了,这就是我们所谓的可插拔。在我们具体做项目的时候。我们根据这个项目的业务需要,我们也需要来定义拦截器,这节课的话呢,我们就来学习一下如何来定义自己的拦截器。
01:03
自定义拦截器。Strong的拦截器,我们把这个知识的话呢,我们来做一个复习哈,虽然说我们前面已经有了比较深的了解。拦截器是抓兔的核心组成部分,抓to的很多功能都是建立在拦截器基础之上的,比方说文件的上传、下载、国际化数据转换、数据校验等等等等。抓图拦截器在访问。I方法之前或之后实施拦截是吧,还有一个之后我们通过看这个图,我们通过前面分析这个抓图流程,我们这个的话呢,我们是比较清楚的。兔的拦截器是不可插拔的,需要的时候呢,加上需要的时候拿出来,实际上它是A编程思想的一种体现,A呢叫面向切面编程,后边我们讲spring的时候还会详细来讨论。呃,多个拦截器可以构成一个拦截基站。
02:03
比方说我们前面讲到的这个default stack,或者是s prepare power stack,他们都是拦截基站,将拦截器按一定的顺序连接。成的一个拦截器垫,类似那个filter链一样在访问。被拦截的方法时,抓to拦截,其料中拦截器就会按其之前定义的顺序被依次调用。我们看抓杜解码的时候,我们知道action invocation里边有一个interceptors,那个里边放的就是拦截气站的那个。拦截器的集合就是按照那个顺序一个一个调用的,还记得吧?那我们来画这样的一个模型,前面我们已经有了哈,我们还有这样一个模型,大家看。在我。调用action以及result之前,我需要经过一个一个的拦截器,然后注意我调完了这个action,我出来的时候怎么样,我还要从一个一个拦截器里边出来。
03:03
所以说这个拦截器的这个代码是在调目标action方法之前或之后执行。看这样一个图。这边这个图,左边这个说拦截,其实这个模型这是不准确的,右边这个才是。准确的这调目标action方法,之前调拦截器123,回去的时候是调321,这个跟我们讲那个filter链是一致的。抓度自带的拦截器,我们就一个一个说了哈,我们在前边讲抓度具体记录的时候呢,实际上我们已经讲了很多拦截器,而且都看了那个拦截器的源代码。现在我们考虑如何来自定义一个拦截器,可能任何一个拦截器啊都需要实现这个。Intercept接口,这个接口里边一共有三个方法,分别是in intercept跟destroy,看到这三个方法的话,你会想到什么?
04:04
In,我们什么时候有过这个in?比方说,比方说。Filter有这个in跟的话,说明这个拦截器应该是。单立的。对吧。在创建拦截器之后马上会掉init,然后每一次工作的时候都是。Intercept。在拦截机被销毁之前调destroy跟destroy。只会被执行一次,而这个intercept会执行N多次。Intercept接口。Struts会依次调用为某个action而注册的每一个拦截器的intercept方法。每次调用CE方法会传入一个action用对象。
05:00
是指action的一个执行状态。拦截器可以从该类里边获取与当前action相关的action对象跟result,那实际上的话,那个action跟result是不是也是这个action调的呀。我们在具体定义一个拦截器的时候呢,一方面我们可以来实现这个intercept接口。还有一个选择就是实现abtra intercept,这个实际上是intercept接口的一个实现,但这个实现啊,它仅是给这个in这个提供了一个空白实现,其中那个intercept方法还是一个抽象方法,对应的这个类也是一个抽象类。Abstract intercept,看一眼。大家看这里边的话呢,就这样的三个方法,In空白实现destroy,空白实现intercept是一个。
06:05
抽象方法。好了,下面我们来看如何来实现自定义的拦截器。几个?第四个。自定义拦截器。一这个自定义拦截器跟我们前面讲到的。自定义的类型转换器,自定义的验证器。差不多。具体步骤的话呢,就是先来定义一个拦截器类,第二步在配置文件里面配置一下就可以了。OK,体步骤别说了啊,具体步骤第一步。定义一个拦截器的被。
07:00
第二步。Be。哪配软件呢?点XL文件中配置。这两个步骤就可以了,第一个步骤呢,我们说哎,可以。实现。接口也可以继承。I put the track。Intercept。口腔类哪个都一样,因为你要继承这个接口的话呢,就三个方法问题也不大。啊,那这个配置怎么配呢,这个配置。我看一下。大家看我是不是有这个intercept节点啊,这里边我们可以干什么?我们可以来。
08:00
定义这个cept是有名字和class吗?这个配置方式和我们在ru default这个配置方式其实是一致的,后边就是使用了。我们先来。定义。自定义的编辑器。自定义拦截器在项目里边的应用呢,非常广泛,比方说哎,来做权限验证。比方说我来验证用户是否登录等等等等,我们这块的话呢,我们先搞一个hello word,这后边做项目的时候,我们会来自定义一个拦截器,它会对用户来实施拦截操作。好吧,现在的话呢,我们先搞一个hello。我说我定义一个买。
09:06
Aspect。OK,哎,我们看到了这个方法,这里边这个直线的话呢,在前面我们阅读拦截记源码的时候已经看过好多次了,我首先我来写一句话叫。A。In。背深点儿。Invoke。再来一个after。好,再来一个student result等于c.in book干什么呀?是不把这个控制权又给到了我们的X?结果返回。
10:05
下面配置一下。Lucy。导到我们的配置文件。就在这个里边吧。An。哎,我们希望能够来用一下这个拦截器。给哪用呢?在我们这个talk里边吧。以前这个reference,这个hello。OK。好做一个。回退刷新。执行。看到了吧,先执行before,然后执行目标。
11:03
Action方法最后的话呢,执行这个after,实际上的话呢,并不是马上执行这个action方法的吧,应该是执行后续拦截器,那最后的话呢,来调用它这个顺序跟这是一样的。用率是一样的,我现在的话呢,这个哈是第一个拦截器,所以说第一行打印的一定是他。那如果在其他的这个拦截器里边也有那个sit out的话,那后边依次输出其他的sit out,那最后一个输出的应该是谁啊?应该是他对吧。看这个第一个调啊,同时。In方法之后那个代码最后一个调。看见了吧。回来。把笔记补充全。这就没什么说的了,是吧,这个配置呢,我们复制过来。
12:04
Control d。先进一个。这个可以干掉。嗯,就是自己来。注册了一个验证器,后边的话呢,使用就可以了,我们选择的是在action里面来使用。里边使用的,那我同样我是不是也可以在我这个stack里边使用啊。可以吧,我如果要是把它放在这个里边的话,它是不是对于任何一个action都有效啊。那我们用的话呢,我们是这样用的。Proceed。过来。我把这个就去掉了哈。我是这样用的,你当然也可以。在这个拦截气站里边给它加进来,这是没问题的。
13:01
好,回来以上呢,就是我们自定义拦截器的基本步骤,这个基本原理我们在前面已经很好的了解了,所以说我们像这个action VOC,我们没有特别的去说它,大家要是对这块不理解的话呢,大家可以去看我们前边呃,Strong to源码解析的。那个视频。运行原理的那个视频。好的。回来。有一个需要注意的地方。这个注意的地方呢,实际上也是我们前面强调过的,为什么呀。找到我们的。Interceptor。注意看。注意这个地方,如果我不调这个,因为我可正常Mo方法,我直接返回的话,它会怎么样。
14:04
直接返回一个啊。Thanks。怎么样?那。默认情况下,我们来看这个。我们来看这个,我现在的话呢,第一个拦截器是。Hello,第二个是不是to啊?这个时候我们看这个token session拦截器是不是被调用了。根30拦截器,CTRLT。Token。Session intercept。拦截器的名字叫。Token。在这呢?对,Consion store interceptor。T。走好了,我们去找一个占卜方法。
15:01
没有类里面。还在那里边。在这呢啊,打一个断点。我们只想看它是不是被调用了。再找到我们的自定义拦截器。对块我也打一个断点。其他的渠道。第八个。找一个瞧着。啊,当然会来执行这个before,下一步大家看。是不是没执行那个第二个拦截器的intercept方法呀,没执行。好了,这个原理是怎么回事?
16:03
再走一遍。重试,大家看。最小化。看这个代码哈,这个时候呢,是default X到了这个方法,我调完这个方法之后。在这里边,然后他执行,他在执行他,他是不是没往回调啊,没往回调就导致了这个方法会。顺序执行吧,这个方法不会再掉一次了,导致这个拦截气站是不是不会往后走啊,往后执行。Code是什么?往后直行我们看啊,这块打个断点。好了,走,看这个时候这个result code。Dis。Result code是不是success啊?哪块返回的。
17:02
这块返回的看见了吧。那于是我就往后直行了,哎,我去。调用了这个结果。再来,于是我给你响应了那个success页面,看到了吧。这就是我们这块需要跟大家讲的。找到note。注意哎。在。自定义。拦截。器中可以选择无调用。Action in VO in。Work方法。哎,我可以不叫他,那么后续的蓝点气和。
18:01
Action方法。不会被盗用。抓兔。会。电缆。自定义。拦截T。Zpt。方法返回值对应的。自定义。这个的话呢,就像我一个。一句链一样,我不掉,那个趁做filter而直接给你一个结果,跟那个差不多。需要注意的这一点恰恰是拦截器给我们一个很好的选择。我们很多时候。
19:04
真的就不会来调X的方法,而直接给他返回一个结果,比方说我们在进行权限验证的时候。比方说我们在验证这个用户是否登录的时候都是这样。
我来说两句