00:00
好,前面我们整合spring session完成了session共享功能,那接下来就来说一下spring session的核心原理,好,我们说一下它的核心原理,那这个核心原理呢,我们来先从分析这个注解开始,那先来看我们这个注解为我们容器中导了哪些组件,产生了哪些功能。好,我们第一个使用的注解是enable RA HV session,那它的作用来点过来,我发现呢,它import,首先这是一个注解,它import给容器中导了这么一个配置,我们就在这来标注它导入了我们这个配置。导入这个配置,而这个配置又做了什么事情,来就来分析一下,那这个配置呢,首先我们来看一下他做的第一个事情,点过来,我们来往上第一个叫ant b给容器中添加了一个组件,是这么个类型的组件,第一个给容器中添加了一个组件,那这个组件呢,叫reddi operations,我们reddi的操作这个sessionposity,那这个reposity呢,我们一般都是标注在我们这个数据库持久层,哎,我们这个持久化层,然后呢,这相当于是我们这个session的我们这个持久层的,我们red的这个操作类,相当于red操作session的这个deo,那现在呢,它导入了这么一个组件,它作用就是哎,Red操作session,相当于呢,Session的增删改查都使用red来做session的增删改查,增删改查的封装类好。
01:38
这个呢,就相当于我们这个增删改查的封装类,那我们把这个封装类呢,先放到这儿,那既然是分析核心原理,那其他的这些小东西呢,我们就不看了,我们接下来继续来往下看,这个呢,它给容器中放了一个我们这个操作session的这个repity,相当于DAO,然后我们再来看它呢,还继承了一个mer htv session configuration,这个呢还是一个配置,这个配置呢,我们来看它在容器中放了什么,首先它初始化post construct,那就是在构造器,我们这个类只要一构造起来,它呢,构造器就会初始化这个cookie s,那么之前刚好自定义了一个,我们就放在这,然后呢,这一块还有一个什么listener adapter,这都是来监听器的啊,相当于来监听我们这个session的整个事件,比如我们这个服务器停机,Session的序列化,反序列化,或者session的活化动画等等各种过程,好,那们现在来看这个,那么这还有一个BB里边呢,主要给我们放了一个这个叫session。
02:38
Reposity filter,来我们一听呢,这是一个filter过滤器,这个过滤器里边呢,比如有session ID的解析器等等,来我们现在来看给容器中关键的两个组件,一个就是操作session增删改查的类,第二个是放了一个这个,这个呢就是session存储的这个过滤器,Session存储过滤器,那这个过滤器有什么用?
03:04
而且这个过滤器我们来看一下过滤器,这个过滤器是什么东西,我们来点过来,我们发现呢,它放了一个这个过滤器,过滤器点过来,它呢,继承什么ones PE request filter来我们再来看它实现filter,我们看这个filter,这就是一个so的filter,所以呢,我发现它给容器中相当于放了一个filter,那这个filter肯定就是每一个请求都得来过滤,它呢,其实就是我们以前大家学过的HTTP的这个相当于每一个请求过来都要经过filter,每个请求过来都必须经过filter,那这样的话呢,他们整个这个原理构造起来,只要给容器中一放这个filter,那肯定就有用了,那么想要看整个原理,那么先来看第一个这个reposity,那么这个reposity它到底封装了哪些方法?点过来,那我们这个reposity方法,我们来control home来看一下它。
04:04
的这个类,我们来F12,我们来看一下整个这个类的结构,它封装了哪哪些方法CTRL f12这个方法呢,发现呢,这有这么多这个方法呢,主要我们来看这有什么get session相当于获取session,包括什么fund的8ID,相当于定义了各种按照ID,这是删除、查询、查找,这就相当于增删改查session的这个类,而我们session呢,是去red来做增删检查的,所以这个类呢很简单放在这,那主要再来看我们这个filter filter呢,它来做了什么control n,既然它倒了这个filter,那这个filter呢,我们继续往下看这个filter,这个构造器什么的我们就不看了,我们能看到一件事,就是这个构造器在创建的时候会从,因为它只有一个有参构造器,如果我们想给容器中放它,那它就会从容器中找一个sessionpoy sessiony就相当存。
05:04
Session的这个地方来存session的这个仓库,那存session的这个仓库,我们给容器中放的是这个叫我们的reddius operation sessionposity,相当于我们把session都存在red里边,M这个filter里边,它注入了,诶我们这个相当于一在创建的时候,创建的时候就自动从容器中,从容器中获取到了我们这个session reposity,而这个容器中获取到的session reportsity,我们之前呢,给容器中添加了一个它,所以它获取到的肯定就是它,那获取到它以后呢,接下来做什么操作,这既然是一个filter,每一个请求过来,相当于都要经过这个filter来看这个filter做了什么,那在下边这个块呢,我们发现它是override,它相当于重写了我们这个do filter方法之后呢,它现在叫do filter internal,好,我们可以来点CR,点过来看谁引用了是这个ones,什么filter,这个ones filter呢,相当于它重写了我们真正。
06:04
菲的杜福要执行真正功能的时候,去来调用我们这个方法啊,我们这个sessionpy就相当于有这个方法,那这个方法呢,我们来看核心就是这么一段话,其实spring的核心那就在这一段话,这一段话大家只要理解了我们这个spring的原理,那就非常清晰了。我们来看一下spring session session的核心原理,它呢主要是给容器中做了一个这个filter,这个filter的功能是这样子的,来就来分析这个filter的功能,那哪个filter呢,我们就来加上来它的这个filter的名字就叫我们这个sessionpoy filter,那这个session存储的这个filter。好,然后我们来看一下这个filter原理,相当于请求一进来执行它,它给request里边set attribute,如果我们以前做原生的Java web应用的话,Request set attribute,那就是在同一个请求期间共享数据的,它相当于把当前的session的操作工厂,我们这个session的操作类。
07:16
Session到底去哪增删改查的,先放在当前请求想只要是当前同一次请求,他们呢使用的都是同一个session的这个操作工类,而这个操作类呢,其实我们全系统就这一个,然后接下来我们再来看,接下来呢,它用sessionpity request rapper,我们来看一下,它把原声这是原生的request是htp s request传进来,这呢是原生的response传过来,包括呢,把原生的我们这个s contest,那们当前应用的这个上下文,我们S上下文传进来,然后包装,包装成了一个我们叫wap的request,所以呢,它现在相当于对原生请求做了一个包装,那么现在来把核心这一块我们来给大家写过来,这一块就是对原生请求做了一个包装,好我们填充,我们就来写一个无填充,无填充颜色,我们来把边框给大家来加上,那现在呢,我们这样的效果,那就。
08:16
是我们现在上来先将原声的请求响应以及当前上下文都来包装了起来,诶这时呢,包装包装我们这个原生请求,它把原始的这个请求对象包装成了一个我们这个waft的request,所以呢,这是一个典型的装饰者模式,它这个包装好了以后,然后呢又包装了原声响应,诶我们发现他把这个原生的请求响应它全部包装了,把这个呢,再来拿一份放在下边,这个呢,又是包装我们这个原始的响应对象,包装原始的响应对象,那包装这两个有什么用,我们来给大家看一下,大家注意,Filter Cha filter列相当于要放行的时候,它调度filter,它不是将原生的request和response放行过去,它放行的,它是将包装过的request和response放了过去,所以呢,放行,他放行的是包装后的。
09:16
它相当于给整个filter链,给下一次的请求,包括filter只要执行整个前置的这个链,执行完了,放到就会放到我们的CTRL了,这都是我们以前的原理,所以呢,它将我们这个包装完以后,将包装后的对象放行到整个后边的执行量,包装后的对象应用到了,应用到了我们后边的整个执行量。那我们来看一下这整个执行量,那这整个执行链呢,最终肯定filter完了都会到我们的crler,那我们来看一下我们的这个controller,那controller里边如果我们要用session,我们主要呢,就是我们的这个o to controller,我们要给session里边保存数据,来找一下我们的这个o To Ctrler,来CTRLN,我们的这个o To Ctrler,我们只要登录成功,我们给session中放数据,我们给session中放数据呢,我们是注入原生的htp session,而原生的http session它是这么获取的。
10:18
我们可以先来看一下http request,我们如果拿到原生的request,那我们想要获取原生的我们的这个session,我们必须调用request点一个方法叫get session,这样呢我们才能获取到原生的这个http session,然后我们才能给它里边存数据,所以呢,接下来他正式利用了我们这个特性,由于我们要获取session,我们必须调用这一段代码拿过来放在这,这是我们获取session的代码。好来看我们现在获取session是要从request中对象中获取的,但request原生的request对象现在呢已经被包装了,包装成了叫session requesty request offer。好,那现在呢,核心逻辑给这儿再来加一个。
11:08
我们这个呢,相当于原生的原生的原生的request对象的我们这个request和我们这个response都被包装了,都被我们这个包装,那包装成什么,那request呢,包装成我们这个,我们拿过来叫这个requestper,现当request的包装器,然后呢,Response呢就包装成了response waper,那包装成这样有什么用?接下来我们第三步,只要以后我们获取session以后,我们获取session,那任何时间获取session,那肯定都要调用原生的request.get session状态,但是呢,我们这个request被包装了,我们放行以后呢,放行的是。我们这个vaper request,那相当于我们以后调用get session,那就是调用他的get session,那相当于它是调用vaper的get session,所以接下来如果vaper的get session有自定义的实现,那相当于就把session的获取方法就相当于改变了,那么接下来接下来就来看一下vaper的这个get session是怎么写的,点过来来control我们的F12来看我们的waper的这个get session好,主要是这个vaper好,我们来看下边呢,有commit session。
12:25
大家注意,这有一个override,那就是重写了的,重写了的,那我们重写了什么,我们看到重写了get session,所以呢,接下来它相当于自己重写了get session,而想要get session,他全是利用自己的操作,比如get current session get到也是一个session,从session里面获取数据都一样,然后呢,它真正的要获取session,我们来随便点一个,我们来看一下。它呢,先获取到这个,如果为空的话,它肯定要重新获取,我们来看它重新获取是怎么获取,如果呢,这个不等于空返回,如果为空,它在这我们看呢,它这块重新要获取,它就是先拿到一个session的什么ID,然后拿到我们这个repsity什么各种找,所以接下来我们来看到他现在来增删改查session的时候是调用sessionpsy,相当于是调用这个的,所以呢,我们接下来这个get session,它真正get来的session是从sessionposy中获取到的中获取到的,而它获取到的那不就是从red里边获取到的吗?我们给容器中放的是red的这个session,所以呢,对session的所有增删改查全是在red中,所以它只相当于只用了一个非常简单的包装模式来我们装饰的模式,将我们原生的request易包装以后呢,你调用get session。
13:51
全部是调用他自己写的这个方法,Vapo request里边getx session全是从这里边获取到的,所以呢,这就是非常简单,那原理呢,就是一个简单的装饰的模式,好,那我们这个核心原理我们就说完了,主要呢就是所有请求过来,我们把它原生请求一包装,然后你以后想要获取session,那都是我自己写的,诶我这个wrapper里边自己规定怎么获取session,你就怎么来获取session,那么现在呢,主要全是在red中来获取session,当然到底都能从哪些里边获取到session,主要呢,我们有一个接口叫sessionpy,那我们当然可以定义非常多的它的实现,我们是如何创建session,如何是保存session,如何找session,如何删删除session,那我们呢,现在用到的默认实现来CTRLH,那现在用到的是red的这个实现,当然我们也可以用map map,那那就相当于是使用内存结构的了,我们来看一下。
14:51
我们现在呢,是使用red来完成session的,包括如果我们导入了我们的JDBC相关的场景,我们还可以让数据库来保存session,我们导了猫狗DB,我们还可以让猫地域来保括保存session等等等等,所以我们只需要变,那这个session存储到哪,那我们以后呢,就完成了我们整个session的统一存储操作,那就一个简单的装饰者模式,改变了一下它的filter就行了,那这就是我们的核心原理,细节原理呢,我们就不说了,感兴趣的同学呢,可以来再来逮巴哥调试一下,而且呢,我们的众筹项目里边也讲了spring session也讲了原理,大家也可以参照相关的原理。而且如果我们用了spring session,所有以前session考虑到的问题,Spring session也都考虑过了,比如最典型的问题,我们只要浏览器不关,我们在整使用期间,我们这个session呢,虽然是30分钟过期,但是呢,只只要整个使用期间。
15:47
我们浏览器不关,我们session呢,应该是能自动续期的,我们来可以看一下red里边我们spring session也实现了这个功能,那么看呢,我们现在这有一个session,它默认呢是2083,我们这么多的毫秒,我来刷新刷新刷新,多刷新几下,我们来看,诶我们把这一块呢,我们来重新来刷新,我们看一下它的这个过期时间。
16:10
他有没有续期,然后发现它又变成了2091,也就是说只要我们对session做了什么操作,我们给里边存取了数据,它session呢也会自动延期,所以呢,这个自动延期等等所有功能都考虑到了自动延期,而且呢,如果不自动延期,我们以前呢,我们用户很少去自己退出,用户用完了以后,浏览器一关,只要浏览器一关30分钟一到期,由于我们这个都有过期时间,所以session呢自己就清了我们浏览器,我们这个red里边的session也就清了,所以我们我们red中的数据,Red中的数据也是有过期时间的,是有过期时间的,这就是完全模拟了以前的所有session事功能。
我来说两句