00:00
接下来我们就来整合spring session来解决我们session共享问题,以及子玉的session共享问题。当然要使用spring session,我们先来进入spring的官方网站,来参考相关的官方文档,来百度spring,好,来进入它的官方网站。来找到spring对应的项目,在projects里边,那一直往下翻,那在下边有一个叫spring,这呢就是来提供一个API来完成我们管理我们用户session的这个功能,好,我们点进来,那spring session我们参照它的文档,这有一个类,我们主要来参照它2.1这个稳定发布版的,好,我们现在整个参照这个文档,我们先来看它的这个目录,这一块呢,有对spring sessionsion的一些介绍,包括我们来看这还有一个samples and gods,这就是我们这个视力和向导,我们主要来看这一块,包括我们spring session,我们现在主要要使用我们的red来保存session,那所以我们这一块呢,在第五章这有htp session的整合,里边还专门有red的这个整合片来,我们可以来从第三张开始看,官方呢,也推荐从这来开始看,这呢S是我们源代码的地址,然后呢,God是我们这个手册的地址,我们下。
01:17
再来看hb session,我们要整合RA来完成我们这个session存储要怎么做,我先进入它的这个引导文档,包括呢,想要看真正的实现,这也有源代码,我们也可以在这儿来参照。好我们先来看文档,文档呢说spring session来整合spring boot,那要怎么使用第一个,首先呢,我们来添加依赖,这个依赖呢是引入一个spring data credit,我们就把这个依赖呢复制过来,我们来到我们的项目,这是我们的also服务,其实后来我们不止author服务,比如我们这个会员服务,认证服务,不止我们这两个服务,可能要整合spring session,那我们其他各个微服务,我们都要用session的话,我们想要解决这些问题,我们都要整合spring session,所以呢,我们可以把这个spring session放到我们的这个common工程,但按照微服务自制,我们也可以来放到每一个服务里边,自己来使用spring session相关的版本来整合就行了,好,我们把spring session呢,我们就放在下边,放在open。
02:17
下边这块呢,我们是来做一件事,就是整合整合。SP session来完成我们这个session共享问题,好,那我们先导入这个依赖,导入进来以后呢,我们来参照官方文档,按照spring boot的配置,我们只需要配一个叫spring session store type就是我们session的保存类型,我们是保存到red里边,好,我们在author server里边,我们来进来,我们来写一个叫spring,来spring点一个session。Session的store,我们现在呢是session的保存类型,点一个有一个store type,诶就是它,那现在呢,想把session保存在我们的red release里边,那么在这就来选择release,当它还支持我们其他各种方式操作,比如也可以保存JDBC门口DB,或者呢我们不保存任何session数据啊,来选择使用red,这是第一步,第一步做完了以后呢,接下来下边也说了,我们也可以自定义一些更多的这些信息,比如我们session的超时时间,包括我们这个red的这个刷新策略,包括我们名称空间,相当于每个session存储的他们的这个前缀等等之类的。
03:40
所以我们可以在这,比如我们调整一个session的过期时间,它呢是调整的是server late的好server,点一个server late有一个session,有一个session的timeout,我们来找一下,点一个session,点一个他们的timeout,末认呢是SESSION10分钟,那我们也可以给来写上一个30分钟,我们这两个写好以后,接下来第三步我们要配置我们这个red的连接信息,由于我们这个author服务,我们来看已经配了red的连接信息,所以我们呢就不用配了,那么第三步做完以后,然后第四步,第四步呢,它说s light container,我们这个serve light容器初始化,它初始化以后呢,这块好像我们不做什么,但是他给我们介绍了一下原理,它我们这个spring boot这个配置呢,已经创建好了,这个配置有一个叫spring sessionpity filter,这个filter呢,实现了一个filter相当于过滤器功能,这个过滤器功能呢,是将原生的session。
04:40
替换成我们这个自定义session的实现,相当于spring家呢给我们写了一个自定义session的实现,那就是用red来存储,那么前两步做完导依赖配,我们存session是使用red来存,接下来我们来再来参照文档,这一块呢没啥写的了,然后呢直接就来开始测试了,那我们在这一块的文档来看一下,再来整合red的时候,这还有一个Java的配置,我们来点开。
05:08
当然它的整个所有示例代码我们都在这儿,我们可以先来看文档,这个Java配置呢也非常简单,把red配好以后,包括它的这个连接工厂,因为我们已经配好了,我们只需要一个注解叫enable RA http session,好把它拿过来,那我们把这个呢,写在我们这个主类上,我们相当于开启了spring session的功能,好把它导入进来,这个整合咱们这个red来作为我们session的存储,整合red作为session存储,所以呢,我们现在这一个注解,我们这个session就可以存到red里边了。那么现在就来测试一下,只要我们这个author服务,我们一登录成功以后,我们就会给session里边保存一个login user,这个呢是一个data,就是我们这个VO对象,那么就来看看能不能存进来,我们把这个O服务来重启一下,我们来主要来参照我们的这个session,我们来看我们的red里边有没有存到我们相关的session数据。
06:11
好,那么现在先来重启这个奥服务,这奥服务重启的过程,那我们在这儿重新再来登录一下就行了,只要登录成功,那我们在这儿呢,就会把我们登录的用户放到session里边,我们就来看最终的效果,好们来等待它重启,好重启成功我们先来清空控制台,我们现在来重新登录一下,我来刷新,我们点一个请登录,首先会来到我们also服务的登录页,那就是来到他这儿,好,那这一块呢都来清空,然后呢,当我们来点社交登录微博,好,那我们填入我们的微博账号密码以及我们对应的验证码,我们来点登录,那登录成功就会跳回来,那跳回我们这个页面以后,它就会把我们这个session存到red里边,但是我们现在看到这有一个错误信息,错误信息呢,说civilization,我们这个exception,现在我们这个序列化异常,它不能序列化,不能序列化的原因就是我们的这个member response VO,他想要给red里边保存数据。
07:11
那相当于要把我们一个内存对象,我们来看这个我们登录成功以后呢,相当于得到这么一个对象,对象呢都在我们这个内存中对空间中,那现在相当于要把我们这个内存对象要远程保存到我们这个reddi服务器里边,所以呢,我们就得把它先序列化成一个二进制流或者串,把这个串呢再存到我们这个red里边,而默认呢,它又使用JBK序列化,序列化呢,要想序列化,那就必须实现我这个Siri asable这个接口,那不实现我们这个序列化接口,我们就默认不能实现序列化,好,我们把这个序列化接口容易实现来重新测试一下,我们现在相当于把登录好的成功的用户,我们就会放到red里边,因为我们也看到这一块报错了,只要能报错,说明他真的想要去red里边存数据了,只是我们这个数据没有实现序列化,好,我们来稍等一下,好,我们现在服务启动成功,我们来重新来登录一下,我们还是来访问他的logo页面。
08:11
好,我们现在来点击微博进行登录,好,我们现在是要登录成功,我们跳回首页,首页以后呢,我们相当于将我们这个登录成功这个用户我们存到session里边,但是session里边呢,我们是保存到ras里边,我们来先来看一下效果。那么这个效果呢,我们看到有一个spring session,诶接下来我们所有的session里边存了什么东西,诶我们这个session里边呢,存了这些,包括我们来看session at tr有一个叫login user,它的值是什么值是我们序列化后的结果,我们在这呢可能看不到,包括呢,我们session里边存在这个数据,它在这呢也有过期时间TTL,所以呢,这完全模拟了们这个session的整个使用流程,那我们现在做的问题就是我们既然给session里边保存了,我们先来看一下我们这个author服务,那肯定呢就会给我们发一个令牌,们来F12也无论访问哪个页面,我们就来看一下这个session的令牌,我们发现这一块呢,确实发了这个令牌,包括呢额外还发了一个这个session这个标识令牌,但是呢,现在这个令牌我们就算发上,肯定还有一个问题,问题就在这儿,它的整个do脉作用域,这个作用域呢,我们说这个令牌作用域太小了,所以我们取不出登录的用户,如果我们这个令牌作用域很大的。
09:27
啊,我们比,比如我们把这个令牌作用域我们改成author,这样我们访问首页的时候,那么这个令牌都可以使用了,这就是我们说的子运问题,因为默认我们在奥里边登录成功,那现在发的这个令牌都是我们这个子域里边的,所以我们这个富域没用,现在我手动先改一下,那来到我们这个富域里边,我们先来看F12,我们看富域能不能用到我们这两个令牌,好能用到,如果能用到我们从富域里边取数据,那肯定就能取到,所以我们来看鼓励ma,那我们相当于在also里边登录成功,那在我们商品服务里边要取我们session里边的数据,但30呢,肯定都是在red里边存着呢,所以我们想要取session里边数据,还要整合spring session,好,那们现在在这同时我们来引入我们的session,我们就在下边缓存里边好来写一个dependency,主要是一个spring session data RA,我们现在来引入spring session以后我们再来做一个spring session的配置。
10:27
置,我们现在呢,只需要做一个非常简单的配置,指定我们这个session呢,是来存到red里边的,好,我们只需要指定一个叫spring,点一个session store type,我在red里边存着,然后呢,我们再来开启我们这个red的这个session存储功能enable,我们有一个叫session,我们这个red的这个功能red htp session,好我们现在呢,把这个开启以后,我们来重启一下商品服务。因为我们这个商品服务呢,我们会在首页来取出我们这个数据,来看一下,首页呢,在这在拟好这我们取出了这个session login user,我们相当于来取了这个数据,我们来看一下,只要我们一切成功,我们就应该能取出我们这个log user这个数据啊,这个数据里边呢,肯定有用户名这些信息。
11:19
那么看一下我们能不能在session里边取到我们相应的数据,好,现在呢,服务启动成功,我们来到首页,我们来测试一下我们能不能取出session里边的数据,我们来回车。好,我们发现呢,这一块报了一个异常,说我们这个序列化异常,那能序列化异常说明我们能取到数据,只是呢,反序列化不过来,为什么不过来呢?我们来看一下,我们要取这个Logan user,那log user呢,这个对象我们来可以看一下,它在这这found class class not found相类没找到,有一个叫member response VO,那相当于我们这个author服务器,我们这个author服务登录成功以后,会放一个member response这个VO,但是呢,在这一块我们就取不到了。
12:05
那取不到的原因是因为类没找到,相当于我们这个项目里边根本就没有这个类,所以呢,我们为了能存能取,那我们就将所有公共的这些东西我们放到common里边,好,我现在呢,把这一块的这个VO我来放到common里,行,我们把这个呢就叫VO。我们来写一个包来就叫VO,然后呢,我们把这个VO我们来拖过来,Member response VO我们放到common里边,好,我们让它重新都变一下,那我们现在author这个服务里边,只要登录成功给red里边会放我们这个VO,现在在com里边,而我们呢,页面来取也会取出这个VO,现在我们也放到com里边,那页面也应该能取到,那现在我们把这两个服务就要重新都启动一下。走,我来重新启动,现在呢,我们的session是存到了red里边,没什么问题,而且呢,我整个测试期间,大家浏览器一定不要关,因为一关以后我们看到这两个cookie,它的作用,于是session相当于我们整个绘画有效,一旦浏览器一关再打开,那就是新的绘画了,你就测不出效果了。
13:19
所以我们先来测一下我们这个效果,在奥服我们之前登录成功以后,那我们将所有的数据我们存到了red里边,我们这个数据呢都有,而且呢,过期时间我们在这呢也都记录好了,那现在我们要做的就是我们also服务登录成功以后,我们给red里面存的数据,诶相当于是给session存的数据存到red里边了,现在我们要从商品服务要能取出来,那商品服务我们这个页面呢,就是在取来看能不能取出来,只要能取出来那就一切正常,那要取不出来。那说明我们的还是有问题,好现在我们来看一下我们的页面效果,首先author服务肯定呢是由我们这个对象没什么问题,它不能序列化,我们来看不能序列化什么,还是我们这个奥VO,诶这个原因呢,在这儿由为我们之前给我们red里边序列化的时候是我们这个类型的,我们现在要反序列化出来,这一块呢,都向当记录了这个类型,所以呢,我们现在要做出完整的效果,我们一定要把我们这个缓存清空,那至少我们把这个session保存的相关数据清空,要不然之前是我们改之前代码存的那个session数据类型都不一样,好现在我们来重新来尝试,现在先来also服务,来also服务呢,我们先来登录一下,来重新走一遍登录流程,好,我们把这一块呢,整个刷新一下,包括我把这一块全部清空掉,清空掉呢,我们将整个session审全部清空掉,我们来重新模拟从头到尾的流程,我来点微博。
14:50
我们现在来社交登录,好,我们来点微博,微博登录成功跳回来,那跳回来以后呢,我们来看古励mail,没什么,我们现在来访问我们这个author鼓励ma.com,因为我们之前登录成功,我们已经将用户信息放到了red里边,我们来确认一下,好,Session里边用户信息这儿都有,Red里边确实有,而且这个用户信息是common VO response这个VO,而且呢,我们发的这个令牌,我们看到默认的这个令牌,它叫session,不叫杰session ID了,这个令牌呢,它作用于只在author范围有效,所以我们来到古力妙取肯定取不出来,因为我们这个令牌呢都拿不到,如果我们让它发令牌的时候,把这个作用欲放大,放大到富裕,好,那放大到富裕我们来首页,我们来刷新,那我们就会拿到这个令牌,相当于我们浏览器就能读到我们这富裕的令牌,那么访问我们这个富裕的项目,鼓励welcome com,我来刷新,那我们你好,请登录这一块的内容来找一下。
15:50
下,那现在呢,肯定就取出来了,那取出来以后呢,发现这一块呢,整个没有显示完全,那没有显示完全,这是我们这个样式问题,诶它是在背后这显示了,好我们要取出完整的效果,我们就在这来log user,主要这个user里边呢,有一个昵称,我们来看一下我们的这个member,什么response VI。
16:12
Response VO为response VO里边有一个昵称,好,我们把这个昵称取出来,CTRLF9页面呢重新来编译一下,好,我们现在来刷新一下页面来刷新走,我们发现,诶,你好,请登录我们这个昵称呢就取出来了,那现在呢,相当于我们就整合成功,但整合成功还有一个问题要解决,那就是我们的这个域名问题。那我们现在留下两个问题,在我们这个author服务里边,我们来打开它的这个author controller authorler,好。我们现在呢,确定已经把它能存到red里边了,那现在呢,要解决两个问题,那第一个问题,那就是我们默认发的令牌,发的这个令牌。
17:03
它呢K叫session,然后呢,值是一个唯一字符串,但是呢,它的作用域,我们来看一下这个作用域,作用域这个作用域呢是当前域,当前域,那当前域呢,它解决不了我们子域的session共享问题,当前域所以呢,我们现在要解决子域session共享问题,我们现在必须解决哪个,第一个解决子域session共享session共享问题。接下来我们要做的第二件事,其实这第二件事呢,我们可以不做,但是我们来给大家说一下,我们发现呢,我们凡是要给session里边放的数据,由于我们都要网络存储到我们的这个red里边,默认呢使用JDK的序列化机制,这样的话呢,每一个B都得实现sirleible接口,可能呢感觉有点麻烦,那如果我们让它用JA森的方式存到red里边,这样我们也好观察,也好看,整个呢比较简单一点,所以呢,我们希望它能使用那这个杰森的的序列化方式,序列化方式来来咱们这个序列化我们的这个对象序列化对象数据到red中,所以呢,现在这是我们这两个问题需要解决,但我们现在效果是出来了,虽然效果是出来了,但是我是手动的把这个子玉放大了,那么下节课就来解决这两个问题。
我来说两句