00:00
下边我们看一下啊。呃,我们从我刚才写代码呢,我们确实这个体会到哈,人家这个东西吧,人家让我们在用的时候啊,假设咱们这个框架环境这方面已经都搭好了,都准备好了,我们用的话。可以说完全无感。是吧,你你这时候你用的时候,你这东西怎么拿进来,就还是怎么拿进来,你这边怎么往里边去存的话,就还是怎么去存,没有任何的你你你我们我们在上面用的时候呢,你不需要有任何的这个变化,它底下呢在波涛汹涌是吧?它这里边儿有一条大鱼。这个鱼在这个里边是吧。啊,他在这个怎么怎么这个,呃,翻江倒海是吧,跟我们没有关系啊,我们在上面感觉不到。这叫什么呀?这种特性叫什么呀?哎,非进入式对。
01:01
就是说我们原本的代码就是不会没有遭到任何的这个侵入。哎,人家底层呢,已经天翻地覆了,已经完全都变了啊,但是我们这边都感觉不到啊。所以这个是这个用户体验就是这个是非常好的啊,非常好的呃。那然后人家这个东西是他是怎么做到的哈,他是怎么做到的。为啥就能够有这么神奇的效果呢?简单来说哈,就是说本质上他做到这一点,就是STEM从底层全方位的接管Tom对session的这个管理。以前是tomcat在管。啊,他怎么去读取这个cookie呀,呃,怎么去进行这个解析呀,啊怎么去。这个存储这个session呀等等,以前是他mca在做,现在呢,他把这活呢都接过来了,说这个以后呢,这事我来干,你别管了。那下一个问题是他就咋接管的呢?他咋就能给接管了呢。
02:04
这个spring呢,它需要完成的这个任务哈,我们看一下啊。你过来发一个请求。请求呢,我这边呢,把这个请求的request对象,把原始的request的对象。包装一下啊,包装出来一个新的request对象,这个新的request对象呢,他再去找session的时候,它是。访问去找找这个session。访去找这个session,然后这个session呢,他把这个session其实也是一个包装以后的session,他把这个包装以后的session存储到handler里边,就传给我们handler,让我们可以用。然后这个session呢。你要是往里边存数据,它是往red里边去存的。啊,包括他自己的信息也是在里边去存的。响应的时候呢,你这handle方法返回一个响应的数据,哎,我返回的也是一个包装以后的response对象,把原始的response对象包装了。
03:02
哎,那么他的这个cookie呢,是他自己重新定制的一个cookie,里边存储数据的方式都不一样了啊,返回我们这个响应。哎,然后呢,下次再请求的时候,带上这个定制过以后的这个cookie,再找我们这个赛啊,再找这汉德。然后呢,整个呢,在这儿是用一个filter来做这个事的。其实我们可以从这看一下啊。看一下application这里边哈。看一下这个cookie。他这个名儿呢,其实已经,哎,它不叫。JID了,它叫session,里边是这么一个值。啊,这是这是一个是当前的一个域名啊,这是cookie的一个pass。然后这个是一个存在的时间,Session表示是一个会画集的浏览器,一关的话就会被释放掉。哎,所以这个时候其实不是解散ID了,这个这个cookie呢,也是spring session呢,它定制过的啊,他另外给了一个,然后呢,他读的话呢,你再发请求的话。
04:06
发请求,请求消息头里边,他带的cookie也是带这个session,等于他的这个啊,就不是原来的这这3ID了,从这也是从浏览器这边啊,从请求消息头响应消息头这儿也是看到他确实是接管了。然后呢,咱们再去看一下它的这个filter。呃,这个filter呢,这个叫。Spring这个叫session repository filter啊,Session的仓库的一个filter。看一下它里边的这个代码哈。嗯。这里边儿它,呃,有这是构造系哈,这里边儿有一个do filter internal。有这么一个方法,这是说每个请求过来的时候都要从这走,哎。呃,首先呢,Request下载attribute往这放了一个什么呢?Session repository。
05:02
This session repository啊,他把这个session用什么仓库呢给传进来。然后呢,这边是。呃。创建一个对象,Session repository request。传进来request response this context,哎,把这三个对象传进来,包装出来一个新的request对象。这呢,包装出来一个新的response对象在称在filter chain do filter里边。把这个request response给传进去。啊,这response给进去。呃。那么这里边儿其实最关键的哈,最核心的就是他做的这样一个包装。哎,最核心的就是做到这样一个包装。嗯。这个包装哈,这个地方啊,他做的这个包装。
06:01
呃,首先咱们来看一下啊,它怎么实现的这个包装。呃,它的这个包装呢,就是是其实是当前这个类里边的一个内部类哈,它要继承http service request。继承他这个东西呢,就不是,呃,不是spring提供的了啊,这就是我们说Java web这边就是其实是so标准它提供的。呃,这个东西是他干什么用的呢。你看这个构造器哈,是把你原始的块对象传进来,传给这个负类的构造器,哎,然后呢,后边呢,所有这些呢,是干嘛哈。呃,里边我们随便看一个哈。比如说get session。呃,Get就是这个this呢。就当前对象哈,这个下划线get http request,这个是获取原始的request对象。
07:00
Get session呢,就是用原始的request对象呢,去获取这个session。呃,他为什么要这么干哎?就是因为呢,你看我们想要去,这是一个原始的request对象。是是,然后呢,我们包装完了以后呢,有一个新的这快对象。其实这个新的块对象,相当于相对于原来的这个块对象来说呢,其实它只是有一点点这个变化,它变化并不大。假设它里边有200个方法,可能呢,这里边儿就可能是五个方法有变化。那我只是需要把这五个方法改一下就完了。那么你另外呢,还有195个方法。我就不改了,我就希望他按照和你原来一样啊,按照你原来是怎么工作的,就还是怎么工作。可是说实在的,咱们去对这个request对象进行包装的时候,咱们也不知道他原来的这个是怎么工作的。
08:01
不知道他原来是怎么工作的。咱们这个代码呢,咱们自己还不会写。一个是不会写,再一个呢,你一个一个写,你也太麻烦了。嗯,又非常麻烦,咱也又不会,所以说这个东西呢,这一部分它保持原来不变的,这部分就不能咱们自己再写了。那咱们自己不写咋办呢?把这个它原本的原始的这个对象拿到用它原始的这个对象去调它原始的这个方法。哎,那这个时候的话,就就他自己肯定知道是怎么干的。所以说呢,这里边儿我呃这个类哈,它就必须呢,得实现这个接口。你看employments http service request,你得实现它原来的这个接口,哎,实现这个接口呢,用它原本的这个对象啊,调这个方法单到他原本的对象去去去,呃。去调他原本的那个方法,他原本的那个该怎么干还怎么干。
09:01
你看下划线这个方法呢,我们点进去哈。这不就就是这个方法啊,哎,叫叫负类的get request。返回this request,这个this request哪来的呢?就是构造器里边这传进来的啊,这边传给他就说用原始的request对象去干那个原本的不变的那些个方法。然后我们呢,负责把会变的这部分重写一下就行了。所以说你看这边呢。呃,就是h request。呃。这个最快对象传进来。嗯,就是这个表哈,你看我们要重写的哪个地方是重写的哈。这个就是重写的趁至30ID。哎,Is required section idd什么等等啊,就这。
10:00
呃,这些这些个,哎,很多是重写,你看特别是干session,这是最重要的,我们这个干session获取的方式就跟以前是不一样的。所以在这儿呢,他。进行了包装。这个包装呢,用到了它的那个rapper的那个类,而这个rapper那个类呢,是人家收的标准里边本来就有的。也就是说呢,人家人家是允许你去以包装的形式去拓展它这个功能的。这个时候这个拓展呢,不仅仅是说你继承一下这个类就完事了啊,因为你要改变它原本的这个对象的行为。啊,这个。嗯。那为什么说咱们说继承一下啊,如果说我就是把这个类继承一下啊,我继承一下原来的那个类,我再重写一下,那方法不就完事了吗。这个还不行。为啥不行呢,因为我们这边哈,你看。我你我还要我这个对象创建出来以后吧,你要是那个子类的对象呢,从这传进来,它就传不进来。
11:03
啊,你这个子类的对象呢,你从这传你传不进来,因为人家要的是这个类型的。你的这个子类的这个类型呢,诶子类类型看进来吗。指负类的。要的是父类的变量,子类类型应该能传进来哈,子类类型能传进来,但是我们这个就是说呃。我想想啊。如果我们自己写一个类。呃。这个实现类吧,这个实现类呢,它每个它这个每个色类容器不一样。我们我们我们现在呢,这个实验类哈,这个叫什么。呃。这个叫啥来着。凯特琳娜。这个这个这个这个要看的话就得具体看一下了,因为我们这边吧,这个。
12:02
我们所有的标准呢,它定义的只是这个接口。诶,我们现在还不是说你不是说你继承一下这个类就完事了,因为我们这儿只有这个接口。你你是你实现这个接口啊,你看这个request也是个接口。这玩意儿也是个接口。他这要的是接口类型。那你如果只是实现这个接口的话,你不知道它那个具体的那个其他方法怎么去实现。所以说它不能通过具体继承类来来解决这个问题,你将来换一个别的service的容器,它就又它的时间类就又变了。啊,这个这个东西还还这是一个很难办的地方,所以说人家service的标准就提。人家允许你就允许你用这种包装的方式呢去扩展啊。Rapper就是包装的意思。嗯。
13:00
在你不知道我们这个接口是哪个类实现的,你是哪个类实现的都可以啊,还是能够让我们这个程序能够切换不同的so的容器啊,它有这样一个问,所以不能靠这个继承来解决这个问题啊。就这里边能不能看到。太多了。啊,他这个相关的这个太多了,是个什么复杂的。Request that。嗯。好像那个名好像挺长的。啊,应该差不多哈,卡特琳娜嘛,卡特琳娜就是我们跟阿伯跟汤姆看是有关系的,人家是这样一个这个类,我们不能说你靠继承这个类,你继承这个类的话,你就锁定了,你只能在tomca上面跑,换了不是tomca,你就不能不能不能跑了,你这个类还得还得还得再重新写啊,所以这个情况呢,不能靠这个继承说我们扩展这个类的方式来实现。
14:00
就得靠这个包装的形式啊,这个其实呢,它又对应一个设计模式。叫装饰模式。嗯。装饰模式,哎。所以说呢,其实他把这些呢,都给替换掉以后,后边的事其实就都是spring spring他接管了,就不需要别人,不需要我们再去,呃操作哈,就但是表面上是一样的啊嗯,表面上呢,他用的还是我们这些个接口。哎,就是这个我们表面上用的接口哈,你看还是呃,Request。这些个接口啊。嗯,就还是这个这些个接口HTTP。Serve。嗯,Late request这样的接口,Http response这样的接口,Http session这样的接口。这个接口是不变的,它的具体的实现发生了改变。这个是我们。
15:05
用接口的时候是感觉不到的,这就是又体现了一个什么呢?面向接口编程。哎,面向接口编程啊,只要接口不变,你具体实现怎么变,我上层上层使用的时候呢,都不会有任何的变化。啊。哎,这就是说我们简单去看一下啊,说这个东西它本质上来说呢,是是借助于我们这个包装或者叫设计,呃,装饰模式。啊,去替换了我们原有的session管理的这样一个机制。然后去实现的这样一个效果。
我来说两句