00:00
我们来学习过滤器,那过滤器呢,是我们Java web里边又一个比较重要的组件,看看什么是过滤器。叫filter过滤器过滤是吧?嗯,基本功能是对surface容器调用surface过程进行拦截,从而在响应处理的前后实现一些特殊的功能。看下这个模型哈。嗯。发一个请求。嗯,我开始的时候的话呢,我要发一个请求到到到这个什么呀,我要发一个请求到。这块啊,我发现一个请求实际上是到一个sol,或者是JSP或者是HTML,而且过滤器怎么了,过滤器就是你在你去之前,我要给你拦截一下。
01:07
在你请求响应到客户端之前,我也要拦截一下,所以说有点类似于什么呀,有点类似于那个写字楼那个门卫门岗,你想你想进去的话,我得先拦截一下看看你,哎,你带着东西啊,包括你是不是能够进这个大厦呀,好了,你出来之前,我要我也要检查一下啊,你是不是偷东西了还是怎么样,这就是我们所谓的这个叫过滤器。这是一个形象的解释。好,C过滤器里边呢,定义了三个接口。叫filter filter chain filter,一共就三个接口,那方法的话呢,加起嗯。五六个方法,五六个新方法,Filter程序是一个实现了filter接口的Java类,跟类似是吧,还进行调用和执行,这句话啥意思啊?
02:15
就是它的整个创建、销毁以及调用方法都是由容器来进行的。这个呢,Filter程序也需要在外网S码文件里边进行这个注册和配置,只有这样说的话,它才可以使用这个可以拦截JSP,拦截S,拦截静态图片跟静态的HTML文件。下面的话呢,我们就来写一个filter的hello world。新建一个。先新建一个HTML吧。
03:02
Index。Come out。这里边儿的话,我写个超链接。啊,我要去一个test.dp。Two page。这个呢,告他是吧,叫taste行了,我这样一跑的话,是不是可以直接连过去看效果。啊,没有没有任何悬念是吧,这个太简单了,就是一个超链接,那我现在希望干什么呢?我现在我希望由这个HTML连到这个GSP的过程中,有一个过滤器拦截一下。
04:09
好了,那我来写一个。过滤器我们先写class啊,它后边有filter,我们先class,看看它究竟是如何来实现的包。看点给鼓点招外。Filter是什么呢?Filter是一个实现了filter接口的大类。就好几个啊,哪个是啊。受,So,这个是,别搞错了哈,一定是XSO,这个是。OK finish。好了,有几个方法呀。坏了,到底是搞错了。
05:02
嗯。等多了是吧,我是不是又。干了一个他呀,被去掉,很牛逼。后面几个方法的话都是正常的,有in do filter跟destroy,大家看见这三个方法呢,你会想起什么呢?So吧,In,看到这个in你会想到什么呀?In这个方法应该是在。Filter被创建之后立即被调用,而且只被调用一次吧,Out in,当大家看到这个filter,看到这个in方法的话呢,你能想起来,诶,我以前学过这个subject里边也有一个in,而且你感觉到这个方法跟那个方法比较类似的,这种就很好,这就是一个学习能力,就是说以前学的东西啊,可以迁移到这块了。
06:03
来一个。再来一个,写完。那跟so相类似,这个filter想用的话,也得在这个WEB2文件里边配置跟映射一下。不来。复制这个权利名CTRLC到这。拔掉。注册。映射我们会看到这个注册跟映射跟注册映射so是一样一样的写吧。
07:05
Filter name filter。Future。Filter,然后呢,Filter name hello filter下面应该叫啥呀?D pattern,我要拦截的是根目录下的test.dp好。大家看我是不是到了这个度Q的方法呀。往前往前翻是不是有一个init,好,我我再跑,每次是不是都会到这个do filter,这个in只会被执行一次,所以说代码写到这种程度的话,你是不是发现我们这个filter跟so几乎一样啊,OK。
08:04
好了,我们来写一个笔记。Not that。第一个,第一个我们需要知道filter是什么。第二个,我们需要知道如何创建。一个filter,并把它。跑起来。好了,再说的话呢,就是相关的API。看第一个什么是filter filter呢,我们我们这样写啊,是Java web的一个重要主教。
09:08
哎,比较重要,也是这个Java外的规范之一,然后它可以干什么呢,可以。对,发送到。的请求进行拦截。并对响应也进行拦截。哎,这就是我们。Filter的这个作用,首先它是一个主件,它可以对请求进行拦截,对响应也进行拦截,看谁呢?看这个请求我拦一下子,响应我也可以拦一下。然后再写一个,说是实现了。
10:03
Filter接口的类。好了,还有一个filter需要在web.XL。文件中进行配置和映射,这就是我们讲的这个filter。一。二三。好了,下面我们看如何来创建一个平,把它跑起来呢?我们说具体步骤一。创建一个filter类,怎么创建啊。实现filter接口就可以了。二。在web.XL文件中。
11:04
配置并映射单,那第一个没啥写的哈。要写的话就这样,然后的话呢,你实现接口了,必然需要实现接口里边所有方法,第二个这个吧。这个就是注册和那个设,这跟我们注册跟说那个设是不是很像啊,唯一一个需要注意的是,诶我这块的UR patternon是什么呀,这个是标识着我要拦截哪些资源。那我拦截的是根目录下的Twitter JP,你也可以说我可以通过什么样的方式访问到这个filter从。从这个角度说,我从哪些URL可以访问到这个filter,那这么说的话,这个so ul patternth是不是一样一样的呀,那那我这么说,我说呀,我可以拦截哪些资源,哎,从这个意义上讲的话呢。
12:11
跟那压跟那个搜链的月压看呢,它多少有点不一样,但是本质上而言是一样的啊,写一下吧,说其中。URL。指定该可以拦截哪些资源?可以。通过哪些?URL访问到。该行了。现在可以跑起来了是吧,我们来看相关的API。相关API的话呢,我们首先看filter接口的,我们一共是有三个API,第一个叫接口。
13:07
三个方法一。什么东西啊?传了一个。吧,他们这个你会想起什么?说不定还记得吗?第二个方法。Do filter。看到这个的话,你会想起什么呀?不行,说老师我啥也想不起来,你就不要问了是吧?
14:00
想起来还是挺重要的啊,这个这个方法类似于类似于的方法,那怎么类似啊,说在。创建filter对象后立即被调用,切,只被调用一次好了,那到这块的话呢,我们看什么时候创建这个用对象啊。大家看这块,我这服务器才洗完嘛,是吧,是不是在是不是在我加载这外部应用的时候,这个需的对象就被创建了呀,然后说哎说呀,需的对象,比如说对象在。容器加载当前外访应用时具备放点。
15:14
Filter对象在容器加载当前外部应用时就可以看见好了,那这个方法的话呢。CTRX。嗯。好了,那G密创建什么该方法干什么呢?该方法用于对当前的filter进行铺,是啊,操作完了,那这是一个生命周期,方法只被调用一次,那这里边也说明什么呀,也说明这个filter实力是。
16:12
单立的,然后呢。F实力是。嗯。单。好了,那。再来吧。一会我们再写一个,写个啥呢?是不是看见这个很了,你想你会想到什么。类似于这,或者说你可以认为他俩完全一样。一几个方法,你看这几个方法哈,Get name get in get in name get contact跟我们那个contact呃的方法是不是一模一样啊。
17:06
都一样。所以说这个的话呢,跟它完全类似,只不过这里边儿我们要额外说一个的话,还有一个什么呀。可以。在当前可以在web.XL文件中。配置当前filter的初始化参数怎么配?配置的方式啊,配置方式,配置方式也和类似。所以说我们讲完之后啊,这个东西将变得特别easy,写一个你看。
18:05
26ROOT过来。CTRLC。它就是一样,在这呢,没啥说的,那我我这些方法的话呢,我们就不讲了哈,大家自己来一个一个测,因为它跟确实是非常非常的相类似,OK看第二个方法do filter,那这个do filter你会想起哪个方法呢?那如果你要能想到service的话呢,真挺好的,或者说你可以想到我们刚刚学的那个do t do开头的吗?Do t simple tag support里边simple tag接口里边do tag这个呢,是真正filter。
19:03
逻辑代码。逻辑代码需要编写在。该方法就是说真正进行拦截的代码就在这个里边,就do filter,那呃,每次。环节都会调用该方法,我们看到了啊,就是这样的,你看我说。每次都会掉好了,那这里边儿的话呢,一次掉一次啊。我不是摁的多,那这个的话呢,我们也看到一个什么问题啊,看到这么一个问题,你看我说请用这个JSP啊,我这个JSP页面有东西吧,有一行字吗。是不是没显示啊。嗯。没显示这说明呢,我这个请求啊,并没有到我这个JP说明什么呀,说明。
20:05
你只是把我这个请求给。拦截下来了,只是拦截,拦截之后的话怎么了,但是我没让你那个请求过去,懂这个意思吗?就是我这个截到了,OK,我给你截下来了,然后完了让你上山做压寨夫人了是吧?你想去会以前那个小白脸睡不着了。没到,那我直接给你留下来,OK,在这跟你说了句话是吧,留下来吧,然后就留下了。好了,那下边的话呢,我们可以干什么,我们可以给它放行,我们说说叫放行,怎么放行呢?啊有个片点度。好锤看一下。没有重新加载哈。好了。是不是看见页面了,这个时候是真正放行的方法,好了,过来过来在这里边说。
21:09
那这里边的话呢,我们会看到一个很重要的一个叫filter chain filter。翻译过来啥意思啊?F。就是这个filter啊,可以有好几个filter,它们可以构成一个filter量,说多个filter可以构成一个呀,好了,这个filter例的话呢,就叫future t。看一下吧,CTRLC。他不来。这不是不是巨爽啊,这不只有一个方法呀,叫度爽。只有一个方法。但是。
22:00
它的方法叫filter,这个方干什么呀?把请求传给filter链的下一个filter,然后呢,若当前filter是filter第二个,最后一个filter将把请求。给到目标,So或者是JMT。这就是到filter chain,就是说我只要我到了这个方法的话,就意味着诶你往后走吧好了,那既然这样的话呢,我们再写一个学条,再写一个,我们看要是有两个的情况,有两个的情况是啥样的呢?小刚,Second。
23:05
Extend。啊,不是一个就control。什么情况保存ctrl o OK有了。讲方法。好了,这里边儿的话,这个in。你给我写一下吧。Sit out是什么?Second?写一下second do,再写一下。
24:04
飞。赶来的第。写完写完之后的话呢,这个我也放行了啊,往后走吧,剩点不六条快写完好写完之后呢,配置一下,配置方式跟上面是一样的。Ping。C。Filter engine。Ul。
25:00
根目录下的所有写所有写这个JSP吧,写完好,写完之后的话,我们要观察一下,要是有两个filter的话,这个。Filter被创建销毁执行的顺序是什么样的?先过来看啊。是不是先创建啊,然后说吧,那这个顺序。和什么有关呢?肯定是跟我这个配置这个顺序有关吧,你不会想啊,我这个是新写的,这是后写的,不应该不应该是跟这个顺序吧,那我现在的话呢,我把这个。CTRLX拿到这个的前面来。保存再看。
26:00
要看。这个顺序啊,貌似跟他没关系,这个家伙怎么了,这个家伙还是在。还是在这个,不是这个家伙啊,Hello future还是在前面,那跟这个没没关系的话,那跟这有关系啊,我们就只能是寄希望于跟这个filter mapping有关系,那跟filter mapping有关系的话,那我就那我这样吧。好了,怎么办呢?我把这个放到它的后边,这种写法呀,我们只有在教学的时候,我们会跟大家交代一下是吧,开发的时候肯定不会这么像开发的写,你写是不是写一对啊,现在的话他俩是一对吧,这个跟他是一对吧。喂。还是这个在之前我们看到了这个创建的顺序,跟我们这个配置没有关系,我发现什么了,我即即便是把这个。
27:02
C肯放前面,它也不对应,它也不是对称创建,我把这个放前面。我把这个啊,我把这个注册这个放在前面,它不是这些创建的,我把这个放前面,它也不是对创建的,那我们只能去希望于什么呢?我们只能是看哎,它被拦截的顺序是什么样的,这个比较重要啊,我翻一下大家看是不是先second后度filter。这个顺序怎么样?这个顺序是跟这个filter mapping有关系的,再说一遍啊,拦截这个顺序是跟这个filter mapping有关系的,好了,我拿过来看CTRLX往哪了呢,这来保。创建那个顺序的话无所谓。再看我是不是先是do filter,后是second do filter,这两个filter放在一起,就构成了一个叫filter链。
28:11
嗯。我呢要发一个请求。目标是,哎,我后边的这个比方说GP。比方说这是一个JSP这个目标,好了,我中间呢需要有两个filter。单看。这是一个filter条,可能也不一定是两个是吧,N多个filter。两个吧,两个好办一个。好了,那这个时候我这个请求是什么样啊,我这个请求先需要被第一个filter拦截一下。
29:07
然后呢,需要为第二个filter拦截一下,最后这个请求才会给到我的目标资源,它这么一个顺序,那这个时候呢,这两个放在一起。称之称之是一个叫filter链。这个就叫future。好了,那两个放在一起,两个放在一起叫链,那实际上一个的话也叫链,只不过这个链上只有这个链上面只有一个filter,就是这个意思过来,那么我们最常用的方法是哪个呢?就是这块,我们说的这个叫do filter,它可以。嗯,把这个请求往后传给下一个filter,或者是给到目标资源,什么时候给目标资源,当前filter是最后一个的话,那我就给到我们的资源,这里边的话呢,我们顺便说一下,这是吧,说多个filter。
30:17
播个。拦截的顺序和什么有关,和?Silver。配置的顺序有关。和filter配置的顺序有关。靠前的。先调用行了,这就是我们的最后一个。是干啥用的?销毁的方法,销毁,释放释放释放,释放释放。
31:06
当前filter所占用的资源的方法,然后呢,占filter被销毁之前被调用切。只被调用一次,这个比较简单,以上的话呢,就是我们这块讲的filter核心的内容都在这儿呢,我们捋一捋哈,第一个说什么是filter是Java web的一个重要主件,可以对发送到service的请求进行拦截,还可以对响应也拦截响应,这个拦截的话呢,我们在后边我们详细来说。然后filter实现了filter接口的JA类,Filter需要在这里边进行配置跟映射,如果创建一个filter两步,第一步创建一个filter类啊,实现这个接口,并且实现方法就可以了,然后的话呢,第二步在web s软件里边进行。
32:12
注册跟映射,整个这个过程跟开发一个survey非常像,相关API filter接口里面有三个方法,In注filter跟destroy,这个对应着service的in service跟destroy,然后的话呢,里面我们详细说了两个API filter con,这GU没有详细讲,这个跟some非常像,大家可以来。验证一下其中的这四个方法,实际上用的话呢,可能会用几个呢。过来看啊,最常用的在这呢。比方说干ter,干solid context,最常用的话呢,也就是这样的两个方法。大家一会儿可以测试一下,然后的话呢,我们又讲到了一个什么呀,如何在OS文件里边为当前filter来配置初始化参数,具体获取的话呢,大家自己来进行实验,Do filter真正拦截的逻辑需要写在。
33:12
这个里边它里边有有有三个参数,Request response,这就不用说了。请求跟响应啊,还有一个叫filter链。多个filter构成了一个filter链,这里边只有一个方法叫do filter,它会把请求传给下一个filter,或者是。直接传给目标资源,什么情况下传给目标资源啊。如果当前filter已经是这个量的最后一个了,那我下一个再连的话,是不是连到更多资源了?好了,好多个filter拦截的顺序呢,跟这个filter mapping配的顺序有关,靠前的先别调用。
34:00
工作原理这块的话呢。看一下。这个点我们基本上都已经说过了啊,我们看最后一个说filter中各个filter拦截顺序与他们在外部F文件中被映射的顺序是一样,映射的顺序是什么意思啊,Mapping吗?In。Big z。说过了哈,我们来说一下这个吧,叫。与开发sol不同的是,Filter接口没有对应的类可以继承,开发这个过滤器的话,只能够实现这个接口,你sol接口它是不是有好多好多类啊,比方说那个general,我直接去实现这个service方法就可以了吧,其他的其他几个方法不用管,但是这个filter的话呢,没有。没有类可以继承,就这么一个接口,你必须得继承这个,实现这个接口,即便是service第四段里边啥也不写的话,你得给我提供一个空方法,否则不行。
35:05
Do,我们说过了啊。啊,当客户端请求目标资源的时候呢,服务器会调用这个目标资源相关的注filter方法,然后filter链T代表filter链对象。嗯。没啥说的,我们都已经说过了,就好听。说的很。这个对象本身代表的是filter配置吧,它跟相类似。Auto mapping。The in the,我们都搞过了。注册filter过了,还有一个这个的话呢,我们后边讲。这个指定过滤器所拦截的资源被色的容器调用的方式,我们后边说映射。
36:07
同一个webs文件里面可以为同一个filter设置多个映射,这个so是不是也是啊,我访问一个so,我可以有多个映射。好,这是整个这个执行的这个呃流程,这个流程的话呢,我们这块我们也看一下是吧,我在请求的时候的话呢,我这块有三个filter,然后我目标有个他给你的JSP,我们这我被这三个filter一个一个拦截,我这三个filter构成了一个filter链对象,好了,其中呢,我如果给到FILTER1FILTER1啊,我直接叫了一个趁角度filter方法,它会把这个请求给到我的filter to吧,诶我filter two里边。我不叫这个方法了,注意哈,我直接怎么了,我直接给了一个请求的转发,看见了吧,我直接这么搞的,或者是一个重镜像都可以,这个时候怎么了,这个时候他是不是直接就去另外一个页面了,注意这个时候这个请求是不是没往后走吧。
37:13
没找我直接怎么样,我直接给你。拦起来了,比方说哎,一个人呢,要进这个大厦里边是吧,我要去这个干点事儿,然后保安一看,对不起,你不符合要求,我直接给你带到了这个一个这个小屋里边是吧,我要给你检查。我要给你检查身体或者怎么样的是吧,哎,这样的话呢,我这个时候这个future我有权利决定着是不是让你继续往后走,还是给到你一个其他地儿。The叫拦截,古时候为这个皇上选美,怎么选大家知道吧,是吧,真正好的女子实际上没被皇,没被皇帝给选上,都让那些底层的这个当官的给留住了。
38:03
你看你们对那就就不了解哈,好了,我们来做这样的一个练习。这个练习呢是这样的,我有一个log in.JSP目标是hello.jsp要求非常简单,Log in.JSP请求到hello.jsp这个页面呢有两个text,具体应该是一个text,一个password,啊,You nameme跟password,然后呢,我有两个filter,一个叫name filter,一个叫password filter,它来拦截什么呀?拦截login JSP这个结果启动页面就拦截这个hello JSP,就是他俩都再来一下,其中user nameme filter,若user nameme不等于汤姆。则将请求直接返回到我们这个里边,就这个时候不等于它的话,直接回来,直接回来提示用户名错误,如果等于他的话呢,就接着往后传。
39:01
往后传的话,Password我要看什么呀?看这个password是不是等于1234,如果不等于二,不等于1234的话,我再把这个请求再给打回去,告诉你密码错误,如果要是OK的话,我就给到这个目标页面,然后输出一个hello,误清楚吧,我们再提一个要求,我现在呢,从要求这个汤姆和1234配置到。当前web应用的初始化参数里面。提一个要求哈,这样写。说呀,我们的要求我们这么提吧,说汤姆德内,我们这地方我们就说这个汤姆吧,汤姆需配置,为什么呢?有the name filter这个filter的初始化参数,而password什么呀,在我这里边的话呢,是1234。
40:13
需要配置为当前外方。应用的初始化参数,换句话说,这个汤姆可以可以如何来获取啊?它可以调用filter config的get in per,而这个1234呢,它需要调用。Contact guide in the,还记得,还还记得这个吧,这个叫什么?这个叫filter的初始化参数,我画一下吧。而后边这个呢,叫当前外部应用的初始化。
41:03
好,把这个练习写一下。一起来实现一下两个GP,我们就用这两个了哈。Index多大哦?这这不也TML啊,用这个不行吧,为什么呀,因为他需要到这个login.jb上面去。去提示是吧,我们在HTML上面是没法提示的,这不还是得写JSP。嗯。浪费点GP。Form。Hello JSP。表单method的一般都是。
42:02
Name put have name name。也裤子太不死。嗯。这样一个一个按钮。刘飞。Hello。选EL了啊part点。写完这要是没有什么呀,要是没有那个呃,过滤器的话,我直接就可以连过去了,上面写两个过滤器。
43:10
直接见。下一步完结的是什么呀?Hello JSP吧,跟目录下的hello.jsp。还再建一个password filter。我也是什么呀,也是hello。
44:04
喜欢看配置文件。CTRLC的F。二。配一个助始化参数。Her name you name value。放。还需要配个什么呀?他需要password password是当前用的初始参数,这是配在这the per name as。One。摸Y1234写完。行,我来看它。首先我需要获取当前。
45:04
Filter的初始化参数需不需要靠它过去?所以说跟写so一样,先需要写个什么呀,分变量吧。Tu can keep。没什么讲的哈,现在这种基本逻辑方式必须要有,因为我们讲的时候啊,这个源码我们是写过的,必须必须要想到。好了,然后呢,获取in user等于filter.get inter。You name s。这个的号。好,再获取一个string的user name等于request点。
46:02
叫优端面。If,如果e u.e uin,那不等的话什么呢?我是不是要有一个请求的转发去你log加P啊,request.get request de根目录下的。log.sp.forward request response,后面的把不执行了吧,完事了,好了,同时request.set attribute,发个消息吧,Message。用户名,用户名不正确。Login的电梯。喂。
47:00
MESSAGE2个边。好,第一个的话应该可以用了,保一下试试。B和V挨着啊。对吧,不正确,那我还可以让他进行回写,怎么回写啊。看点。有点OK,一个完事,下一个错的。这需要用谁呀?是不是用service contact也需要用它?
48:12
然后呢,获取。他等于谁?FN港。这个都肯定点代这个刚才是吧,Getter。八字。848是真的。Ward等于request点点that什么呢?发错了if不懂,比你他发错了点E,它说如果要是不等的话,说什么了也是request.s。
49:09
密码不正确,然后request点,再request。登录下的。一加二包我保存。喂。Abcd。域名不正确。汤姆。随便写的密码啊,密码1234O了吧,这样整个这个操作就成功了,这就是我们在这里边使用两个filter的这样的一个效果,当然了我们这个并不具备任何的这个生产价值哈,我们只是为了在前边的话呢,做一些做一些这个巩固练习的目的。
我来说两句