00:00
我们来看这样一个需求,就是为论坛过滤不雅文字跟HTML的特殊字符。过滤不雅文字这个事非常简单是吧,我发一个帖子,上面写什么I fat呀,什么seat呀,我把这些需要变成西中星,是这么一个需求。这个需求我们来做一下,比方说呃,我有一个GSP。P。好了,我写个表单,Four。我直接去到另外一个GSP,比方BBs.GSP。Leg。然后呢,这块我写的内容。Like the area。Cold。
01:07
我这写一个提交按钮。写完好了,然后呢,我有一个目标页面,BBX加ST。这个页面呢,把这个内容显示上。是这么写吧。这样的话呢,我这个最简单的一个开发呢,就写完了,我们看一下。啊,比方说请abcd。What?搞错了啊。
02:14
六件。哦,是不是被拦了呀?看见了吧,我是不是在整个filter这个这个体系下呀,那你这个页面怎么了,你这个页面是不是在我拦截这个范围内啊,我没有权限访问,所以说要求先登录,然后才能访问,看见了吧。那好吧,那我这两我这两个页面啊,不能够放在这个下边,放在这个下边的话就是有问题的。我们。这样写一下吧。刚才找操。这样写还不行,这样写完之后的话呢,你要是一搞骚的话,我这块怎么了,我这块的话呢,还是有还是会拦截所有所有的JST。
03:07
那我们这样吧。我为了让我这个GP不受影响,我暂时把这个自由给屏蔽掉了啊。Ctrl iPhone,哎,为了不受影响,暂时先屏蔽掉了。这个时候是没问题的。然后呢,回退。I count。这就可以了。好了,我们写个abcd。比较可以看见这个内容吧,是吧,这是最简单的,我希望什么呢?我仅希望这样I。好了,过来之后这块是不是发这不好,我们将这个发变为星。
04:02
这么一个需求。前提是在不改变这两个页面的情况下完成这个过滤。就这个页面就长这样,这个页面就长这样,我怎么样呢?我中间用一个过滤器帮我把这些不雅的字符给它。过去要。写一个。比方说。叫。Something。有。下一步这个呢。我拦截的是哪一个呢?我拦截的就是BBs.GP就这个页面被拦一下,别的我不动。听进去。好,怎么拦截?
05:15
写完。可以了,好了怎么拦截?前提是这个页面不动,这个页面也不动,我实际这个拦截这家应该怎么拦截。能想到的。第一步,首先干什么呀?获取。请求。参数的值具体是哪个性的参数啊。康复。第二个。把集中。But。对。等。
06:02
字符。替换为。这串吧,一个为。行行行行。That。然后的话呢,转向目标界面。一道,嗯,这就完了,就是你要去那个地的话,你还去。没有任何的这个影响,那。写吧,于是找一个方等于request。Voter。然后说如果包含的话,一。我们这个过滤啊,只能够实现什么呀,不能够实现完全精准的过滤。点。吧,只能说哎,它包含它,但是比方说我这个B是这么写的。
07:02
目前这个没有很好的解决方案。我们是不是也能看懂它是什么意思啊,过滤不了。我们只能是说,哎,包含这个的话呢,我要过滤,包含这个的话呢,严格意义上讲的话,前后要有空格。我们有一个单词里边就是有这个FDK这其中的一个,这个单词的一部分,你不能你不不能给它过滤掉吧,所以说这样包含的,我们要把这个F1C给给它过滤掉好了,怎么过滤呢。那马上想的就是很快的点。他有get per也会,也应该会有that吧。没有吧?哎,这是一个事实哈,我们request里边没有提供什么方法让我直接。把这个呃,请求值给它置换掉。说。
08:01
Survey。或者是HTTP。Sorry。中并没有。提供不?But for me。嗯。2Y0并没有提供类似于这样的方法,类似于。这样的方法他没提供,所以说你直接去去不掉。那踢不掉的话,同学们应该怎么办呢?我去不掉,追会,这个比较简单了,去呗。Future,你干啥干啥地是吧,To future。这个不能变,那那怎么办呢。那怎么办呢?你看我目标这是怎么写的呀?
09:01
目标这一行是不是相当于它呀。request.getter。我们说了,这一行代码还不能变。这就这样,等于是这块的话呢,我们还不能给他。还没有办法。怎么办?同学说老师我用反射可以吗?通过每种服务器对这个HTPC看实现的方式不一样,你你用反射的话,可能他看里边解决了其他的那题还没解决。所以说大家就不要想着说用反射去解决了啊,不行这种情况。怎么办?我们需要怎么了?我们是不是需要来改变一下request get这个行为啊?我需要去改它,因为我这里边我替换已经替换不了了,那怎么办呢?那我的目标就是说。
10:01
前提哈,我没有办法来把这个参数值给它换为合法的,我没有办法换,于是的话呢,目标是这样的看。目标数量改变。It it be solve the request。Get。对。方法。的行为怎么改呢?说。若。啊,该方法,该方法的返回值中包含。FUBK。得。替换为。1234包含其他的那个道理一样,这个循环就可以了,好了,记住目标,目标是要改变这个方法的行为,因为什么呀,因为我在这一块,我在目标这块,我照的是是不是就这个方法,而且的话呢,我们还说了,我没有办法去通过什么set for meter啊,或者反射呀,把这个值根的给它替换掉,所以说我只能去改变这个方法,那如果这个方法返回的值都是像我说的这样的话,不就可以了吗?那我们去。
11:32
把一个类的方法进行改变的话,最直接想的方法应该是什么方法?就是说我有一个类有一个方法呀,但你这个方法呀,我觉得不好,我想给你改一下,我们用的最直接的办法是什么办,什么办法呀。是不是继承啊,那于是的话,你就想搞一个继承呗。于是我们就会写一个什么呢?写一个MYTP。
12:01
好了,写完之后的话呢,我们知道这个APP上它是不是一个负类啊。FTP。行。好了。I。好,我现在要干什么呢?现在我说呀,我要去重写这个get。Pro方法。整差了是吧,Request是吧。是吧?写错了啊,摆放。我改的是谁呀?改的是htp service request。写错了啊错了HP它。也快快了。这个request是一个类还是个接口啊?
13:03
是一个接口吧。这个时候比较麻烦了,这要是一个接口的话。这或许怎么样,或许没有那么那么大的本事了呀,是一个接口。于是看。Employment atttp。对吧。是不是N多方法呢?你不会想着一个一个去实现吧?你不会想吧?一个第一,一个一个实现很麻烦,第二有些方法我们也不会实现。比方说这个方法返回请求的方式是get的方式还是破的方式?你知道它应该如何实现吗?不知道,再比方说,呃,返回cookie,如何返回这个cookie数数你知道怎么实现吗?不知道,因为这个需要跟他们看的服务器交互,他们开的服务器怎么搞的咱不知道。
14:03
所以说我们现在我们看啊,哎,我们开始想的这个办法叫继承。出来吧,说一说,如若。对于方法。对于一个类的类。的方法。不满意。然后的话呢,需要。进行重写啊,最合适的方法最常见。的方式是。重写玫瑰。是继承。物类溶解方法。但是我们发现现在这个。我直接去,我现在我是不去实行那个接口了。我实现这个接口这个事啊,一点也不靠谱,同学说,老师你这块你不说是继承父类吗?你咋去实现接口呢?
15:04
是好。我俩重新继承那个负类呢,大家想我一旦继承负类的话,那我这个实线是不是就是跟服务器的这个实线相耦合了。就是这个时候我把这个服务器换成另外一个服务器的话,不好用了。为什么这么说呢?因为。我去打印一下来看这个。这块,因为这个实现是谁实现的。因为这个是他开的实现的,你过一天你用了另外一个服务器,这就不行了。先看一下。Open。嗯。看见了哈。在这呢?叫什么request?最好的算法是它。那我现在如果要需要改写呢,若。
16:01
我们这个时候我们需要怎么样,若直线。和。需要。继承继承等继承它而整全的啊。这个。而这是,这仅是。服务器的实现,若更换服务器,若更换服务器。该方案。行。无法使用。开始就不行了。然后的话呢,就是第一个方案,第一个方案一会我们我一我们我们也试一下啊,就直接写一个。写一个什么呢?Attt request接口的实现类,我发现这个刚才试了是吧,这个相当不靠谱,为什么呀。
17:08
无法。实现。其中的。保换是无法实现的,因为我这个比方说我去读取什么car coding,这是跟服务器进行交互的,一方面的话呢,你要把服务器搞清楚,另外一个就是你写好的话,过几天我把服务器一换了,你这个阀又不行了,所以说呃,这个发肯定是不行,这个打个叉吧,错。肯定不行。好了,那这个方案咱说了是吧,你即便是提供的话,你也仅次于态,所以说这个方案也不行,我们就不是了,提供完之后的话也不能用。或者说也谨慎,或者是也仅仅是在他们看的服务器里边,那也不好。那咋整啊?还有别的招吗?
18:03
三。哎,我们我们想办法了哈,我们想办法这个办法的这个整个的过程呢,是这样的,最开始的时候呢,我想把这个值换掉,但是我们发现我没有那个办法,那于是的话呢,我们的目标就是我改变这个request get from的这个行为,我让他返回的是一个合法的记。我这个方法,我这个方法,我返回的值就是一个合法的不就可以了吗?然后的话呢,我们想了两种办法,第一个办法我直接写一个接口实现类,我们发现这个太难了,实现不了。第二个办法,我们提供指定的实现类的子类,然后就重写那个方法。这个呢,能不能实现并且不说哈,即便是实现了,也就跟那个服务器的实现性耦合了,下来之后往服务器一换,我换成weblo这个了,这个方这个方式还是不行,因为we project那个实现一定不是阿帕奇实现的,那不行。
19:02
所以说这个。还是不行,第三个方还有什么方?啊,这两个花都不行。哎,第三个方的话呢,我们就想到了,我能不能把现在不是有一个request嘛,是吧。哎,我把这个request给他。装饰一下。说。第三个方式,我们说重点啊装饰。目前的。HTTP。要给他看一下下什么装饰啊,实际上就是装饰其。GA。方法而其他方法而。其他方法还和。
20:01
其实现。相同。就是说呀,我们装饰一下它,我不继承,我要对呃,这个对象装饰一下也是一个装饰哈,只装饰这个方法,而其他方法还一样,那怎么装饰呢。怎么装饰呢?我创建一个。看看创建。一个诶。一个类,然后这个类呢。说说呀。对啊。该类实现。这个接口。我们知道你是那个接口啊,我们是无法提供具体实现的吧,然后呢,把。
21:01
把。当前。不。Filter中的。Request传入到该类中。作为。其成员。变量,然后怎么样使用该成员。变量去实现。接口实现。接口的全部方法。这叫一个装饰,怎么装饰呢,这么写啊,我我不是写了吗?是吧,这么老多我一个也不会实现,你怎么办呢,我这么办。我提供一个AP request。你看,然后呢,哎,我有一个方法可以给你带回去的,或者干脆提供提供一个提供提供一个构造器把你传进来,比方说这个方法怎么实现呢?我不知道,但是什么呀,但是哎,我的同学就这样子。
22:17
好,它怎么实现呢?啊,我也不知道。我说时间不知道,但是我传入这个家伙去。看懂了没有,好,于是的话呢,我每一个都这样写。然后直到我们看见一个什么呢,看见一个get,直到这个。这个我实际上,我实际上要说的话呢,我也应该这么写。好了,我如果要是我如果要是都这样写的话,那我新提供这个时间内是不是就跟给那个一模一样啊。那我这个时候你看哈,我首先我要保证哦,我这个类的确是这个类型的,而且的话呢,也实现了你全部的方法,那过来吧,怎么写呢,这么写。
23:07
HTTP。Request等于new my request。那。把这个作为一个构造器吧。构造器。在这。加好。保存好了。我这要是加完之后的话,能把它传起来。哎,我们首先知道它是一个铝块,然后呢,我度。哦。CX这里边不管这个了啊,我直接这样包含就可以。好了,然后呢,我把这个request传过来。好了,我要这么一传的话,那你传到页面上的是不是经过我装饰之后的这个request是它吧,但我还可以当成那个铝派用吧,是吧,过来之后,因为我本身我还是那个类型的呀,然后的话呢,哎,我利用这样的方式实现其所有的。
24:17
方法那跟。我用原生那个request是不是一样啊。那实际上的话呢,这个呃,SOAPI里边提供了这么一个,你看我们看啊APP搜看是不是看见一个类呀。一个实现类打开有什么名driver是包装吧,它是一个包装类CRC,后来CTRLC和TV打开,大家看这个位如何来实现的啊,首先的话呢,我的确是。实现了这个接口,然后对于去每一个实现的话,首先传入一个实现类型的,你看对于每个实现的话呢,调的始终都是叫get都request的方法过来返回谁呀。
25:03
它就是反的那个流派,因为这个还有一个负类,所以说这个看的话呢,它这个好一些。Some。看看这个。大家看里边有一个什么呀,里边有一个request,然后呢。构造器里边给它传进来,看每个方法的实现怎么实现的哈,我是不是都是调的这个request的方法,你看。Get垂跟get吹返回它的啊都一样,都是这样实现的,就是它本身提供了这么一个方法,那我们就用它给我们提供的,因为我们一个一个写的话怎么了。太多了是吧,我回到这个里边来。嗯,不是这个。对好了,我把这个呢,用这个事情来写一下,看着。这个改它是可以叫。
26:00
FTP在不在这里看不该跑。写好,写好之后的话呢,就给过来,但目前要这么写的话,他跟我没写是一样的。再回到这儿来。比如说。你有什么好处吗?有好处,有好处是什么呀,这个时候因为什么呢?因为它是一个类了,我就可以提供我自己的。实现了怎么实现呢?我实现这个接口啊,太没劲了,但是我继承这个类的话却很。太多了啊,等一下。换掉。And。那个。HTTP都在这里。扩器加一个。
27:03
加进来,然后重写什么方法呀。Get好了啊,你也写吧,只不过的话呢,我让你改点行为这样改。保存。加点东西啊,然后就到这个里边来,怎么写呢,这样写。好,再看结果。没有投诉,家长好。是不是加上他了呀。哎,这就可以了。老师,你怎么怎么两个呢,我也在想什么两个。
28:00
等于一个值。我打了两遍是吧。答,两遍。你看这就可以了,然后的话呢,我要利用其他方法,把其他方法长啥样啊,我写一个啊,大家看,比方说我用一个其他的方法回到我的这个里边来,我首先。这么高边。第二,首先我们来看看method。嗯。request.get method,这个实现肯定是正常的。谁呢?To好了我再回来,我来看个什么呀,我来看一个具体的。Request是什么?保存再看。是不是我自个实现那个request,那其中除了那个getter方法以外,我用的是谁呢?
29:00
我用的都是这里边儿这个类,我是用的是不是这个负类的呀,我点它,我们找到get method的方法,我打到一个断点。好,Debug运行。第八个运行。过来。我再说。要看见那个get method了吧,它实际上叫的是谁,这你看你点一下它,它返回的是实际上是不是这个request进行的一个强转呢。它返回的就是这个,呃,本身这个request所对应的method这个request是谁呢?看看get request点它看看哈放这是不是正儿八经的,人家阿帕提给你提供那个。所以说除了我们那个方法以外,掉的都是最原生的方法,而即便是我们实现这个干普密特,我们怎么实现呢?也是掉了人家的方法这了吗?呃,调人的方法,然后的话呢,自己搞了个东西,那我这个增强,哎,我说了算了,我怎么写呢。
30:21
Value等于。点get name,然后说if。Y。不等于now,而且y.contain包含一二两个空格far。那我就把value等于value.replace with,我把这个。换成。
31:00
我把这个画换成。星星,星星。返回谁呀,返回这个Y6就可以。再看结果。对。是不是可以了。哎,这块,这就是我们讲的什么呢,讲的这个叫。Http service request跟http service response service API里边提供了这样一个类来包装装饰原始的request,这个类呢,实现了这个的所有方法,只不过这个内部仅是调用了所包装的request对象对应的方法而已,所以说本身这个类是简单的。这个位置。它是简单的,它有什么用呢?它可以用于让我们对其,让我们对包装的这个request的某一个方法进行。
32:08
增强,我们只需要继承这个类,而且重写某一个方法就可以了。这是它的意义所在,那。类似的也提供了一个什么呀,也提供了一个response来包装这个response。好,我们写一个小节。但这个呢,大家整个做一个了解就可以了,开发时候用的就不多。和。Sum。嗯。我们首先知道这两个类呢,是API提供的。
33:06
这是一个结论。啊CAPI里边提供了这样的一个类,它进行包装,这个类怎么实现的呢?这个类。实现了这个接口的所有方法,但是这些方法是怎么实现的,它仅是调用了其所包装的request对应的方法就可以,类似还有一个它我们看到这个实线啊,这个实现是这么实现的。在这看这个吧。它是什么呀?叫request,我们复制其中的几条代码。过来。还有很多。好了,我们把其中规定的几号代码的话呢,我们来写一下,大家看。这个是什么呀,是不是。
34:04
被包装的。包装。那个。面的改项。它是它然后的话呢,这是一个构造器的,说是这个构造器的话呢,就是把这个给它传进来,站的下的方法我们不要了。这次赛程我们不要了。然后怎么了,然后你看这个方法的具体实现怎么实现的就可以了。怎么实现呢?是不是都是掉了这个request所对应的方法构造器。转入。那个是真的。实现类对象底下呢。哎,具体。实现。
35:01
他的。方法怎么实现的?调用被包装的。那个成员。变量的方法实现。好了,这块还有一个哈,这个类本身包装类。包装未实现。包装。来实现什么呀,实现这个实现这个接口。嗯。大家经常呢会去谈设计模式是吧,这个实际上就是一个这个装饰器设计模式,但是我们不谈这个概念,大家看哎,我想实现的话,我怎么实现呢?前提是我在继承的时候遇到困难了。为什么会遇到困难呢?我要是直接写一个继承的话,我会跟具体的这个呃,服务器的API相耦合,我直接实现接口为那本质,于是的话呢,这个时候用这个装饰器。
36:10
设计模式就会非常的好,首先我实现这个接口,然后的话呢,给我传入一个这个包装类对象,然后什么了,我一个一个用这个包装位的这个对象实现方法,然后我真正实现的是。这个二。作用。啊,我们有了这样一个包装类的话,下边我如何来实现呢?这就是我们说的这个作用,用于修改HTTP。Request或TP。Response的某个。某一个方法。用于对吧,用于。对。这个或它的某一个方法进行。
37:06
修改或增加。哎,怎么写呢?我们的写法是这样的,你看就是MY。It can be soap。后来。这样写啊,我这个肯定也是个什么呀,是不是肯定也是一个request呀,然后我对它进行修改不就可以了吗?这就是它的作用,那具体使用。三。使用我怎么用的呀,我是在我的filter里边。我是这么写的哈,在。Filter中什么利用?这个对象。他替换谁替换?传入的。
38:04
APP。Done。怎么搞的过来这么搞的看。这一发,他要拍白发。还有的就是。对。好了,那此时。到达。目标。或GMP的。APP request实际上是谁?是,这不。那这样的话呢,我就达到了修改。服务器给我们提供这个对象某一个方法的可能。
39:02
就是这么干的。所以说呃,整个的这个使用意义不大,但是对我们这种这个这个提升,对我们这个启示的意义比较大,开发的时候的话呢,实际上用这个的机会并不是那么的多。但是这个我们的启示作用的话呢,几率就大了。好了。那。整个我们画一个图,是不是你下来。但这个比方说我们想过滤不雅文字的话,你可以怎么了,你可以把这些不雅文字的话呢,都一个一个的放到什么里边。比方说这块有什么fast呀呀,还有一些不雅巴是吧,比方说。我好像在不知道什么别的,不想了。好吧,然后的话有很多,你可以把那很多放到一个配置文件里边,或者放到一个数据库里边,凡是有的话你就替换。并不难实现,我们画一个图看一看它怎么实现,我首先的话呢,我发一个请求。
40:06
这请求从谁发的,是从这个页面发动这个页面的话,比方说我的仓。这页面是什么,不是那么的重要啊。哎,我从这个页面上面的话呢,发一个请求。我请求请求的目标是什么呢?我请求目标是一个自费的,或者是一个GSP,比方说我请求的目标是1GGP。好了,那我们的想法是,哎,从在这个页面,我可以把这个不雅文字给它过滤掉,看我们今天都干什么。好了,我从他到他发一个请求过去。我们看到了,我们看到了。
41:00
是这样。发了一个请求,发了一个什么请求。你看。这意味着什么呀?这意味着我从这个页面过去的话,我是不是会有一个request,那实际上走的是怎么走的呢?哎,它也一定是这个请求先到。服务器了,提到服务器啊,只不过中间有个什么呀,中间会有一个冰雹。文件里边中间有一个Q盘。找这个推的话。对,然后呢,我这个con的filter里边,最终我调了一个什么方法,最终我调了一个change.do filter方法,把这个require方法给拿了,我这么传的。这样看上去呢,没什么没什么毛病。好了。送给他,然后这个的话就把请求在。
42:01
表达就是这么一个流程,正常这样写的话呢,一点问题都没有。我们这个这么写实上也没啥问题是吧,给他这是一个filter嘛,然后再给到它好了,这个filter里边啊,我来做了个手脚,做这个什么手脚呢?我从这一块我会发出一个请求,这个请求是HTTP。都没他。你看这个请求实际上是具体是谁呢?我们说具体什么。还有。对。前面前面就不写了啊,好多来我具体看。为什么是他呀,这是不是服务器给我们提供的实现啊,你否则的话,那我这个请求我如何来搞好了。是它是它是它,就是它的时候也没啥太大问题是吧,好了,问题是到这个地方我悄悄的把它换掉。我怎么换呢?我利用这样的一套代码,我首先我首先我把这个进行了一个。
43:07
啊,我这个我先画画到下。回家。哎,我进来之后的话呢,我把这个甲方进行一个包装,实际上也不一定是他是吧,只要是这个对象的话,我就包装了一下,怎么包装的呢?怎么包装的。过来。先换颜色。在编文字三天。自己不要搞坏了。哎。包装了一下,我包包装之后的话,包装之后之后这个对象我叫什么呢?我叫他,我叫atb这个点。这个我起个名。
44:01
我整个这个名字怎么样。然后它什么,然后的话呢,这里边有一个成现变量给它注意这是一个成员变量。好了,我实际上我这里边的方法都是用这个同学变量实现的,这可以吧,哎,我这个首先我是有我实现了一个什么呀,我实现了。我也是这么一个对象,这个对象吧,就是说什么意思呢?我这个类实现了这个接口,但是我不知道如何提供具体每一个实践,于是我靠这样的一个成员变量把它进行,把它进行实现的,哎,我把这个好。好了,然后的话怎么样,然后我悄悄的干了一件事,我只把那个干和密方法给进行了一个修改,这了吗。
45:03
哎,这么一改,于是的话呢,到目标页面的这个request是谁了,到目标页面的这个request就是我这个新的request对象了,然后的话呢,我改了一个方法的目标页面我获取的时候,我会用调那个方法来实现吗?于是你再过来看一下它。PPS你看就我把这个我就用这个方法,于是的话呢,找到它把这块加上一个断点再看。Debug。看看。这是哪个呀?这个是在页面上我们调的这个,你看BBS的11行看见了吧,实际上调的就是这个方法了。然后我先把Y轴得到下一行,对Y轴只是减是不是?
46:05
I发给我是吧,然后看是包含,看着包含了,重新P了一遍就变成它了,最终把这个页面传到了啊,最终把这个字符串传到了页面上。
我来说两句