00:00
前面呢,我们集成了社交登录功能,但这呢还有一个遗留问题,那就是我们登录成功以后,我们跳回首页,首页应该在这来显示你好,谁谁谁,我们登录成功用户的昵称,那我们如何记住我们的这个登录状态,来在这儿显示登录成功的昵称,好,我们先来登录一下,我来点击登录,我们来跳转微博来进行登录,大家跳转之前,我们先把微博的这个登录状态,我来先清清空掉,退出一下,好,我现在登录微博,我输入我们的账号密码以及对应的验证码来点击登录功能,现在呢,跳回我们的这个首页,首页在这儿呢,应该展示我们用户昵称,我们登录呢是写在这一块,我们写在also这个服务里边,我们在这微博只要他登录成功进行回调,我们拿到这个扣德码,换取access token,得到一个社交用户信息,然后呢,利用这个社交用户信息,我们的远程服务,Member会员服务,再呢,去数据库注册或者登录我们这个用户。
01:00
登录进来以后呢,我在这也会打印登录成功或者失败信息,我可以来看一下auto server,那这一块只要登录成功,我们都会打印登录成功,但不能只在我们这打印成功,们希望跳转到古mail com,那跳转到这个首页以后,在这也能显示我们的登录状态,那如果是以前来写单体应用的时候,那们最常用的方式跨页面共享数据,那我们就可以来使用session,好来使用一个http session,我们使用原始API,我们将session拿过来,那就是在整个会画期间,只要我们这个浏览器。打开到关闭,我们这整个期间,我们session里边放的数据在任何页面都应该能取出来,好,我们现在将登录的用户放在session里边,我们看行不行,session.set attribute,比如登录的用户我们来给一个K,那值呢,我们就把登录的用户这个对象我们放到这,那现在我们这个K我们就叫Logan user,好,那就叫login user,这么登录的用户那放到这行不行,我们先来测试一下,好,我现来启动我们的author服务,只有我们这个author服务器呢,变换了,我们启动它,然后我们在首页要获取我们这个值,那么就来到商品服务,因为呢,首页是在我们的商品服务这个页面里边,好,我们就来获取我们这个session的值,我们现在是拟好请登录来找一下这一块的位置,CTRLF,好,我们来搜一下我们的这个,你好你好,请登录,那就在这儿,如果登录成功了,我们就在这儿来进行显示就行了,我写一个双中括号行内表达式do福达号。
02:37
要想取出session中的数据,我们参照SIM的文档,在我们这个录里边,录里边呢有一个web web这一块我们可以取参数,使用P,也以取session,直接使用session,点一个它的这个属性你就能取出来,好那么就拿出这个值,我们取出session里边的一个值,比如我们登录成功了,我就叫login user,好,我来CTRLF9,我们让这个页面呢,来重新编译一下,那我们现在只要登录成功,我们页面呢就应该有显示我们这个用户,好,我们来测试一下,我先来刷新页面,现在这一块没有任何显示,我现在来重新点一个登录,我来点一个登录,好登录呢,我们现在使用社交登录,我把这一块呢,我们都先清空掉,好我们来使用微博登录,我来点登录微博上一次登录成功,那就直接会跳回来,我们来看一下效果好,现在跳回来了,但我们发现这一块并没有显示那session里边的这个用户名,但是我们。
03:37
这是登录成功的原因是什么?我们先来考虑一下们session的原理,什么是session,好来打开我们这个我们的这个原理图,那session是这样工作的,我们这个服务器为了保存我们这个浏览器跟它此次交互的整个会话期间的数据,服务器呢创建了session这个原理,但这个session呢,它是这样工作的,首先浏览器访问我们服务器,比如我们进行了一次登录操作,那如果我们登录成功,我们呢,一般将成功的用户保存在session中,Session呢,其实就是服务器里边的一个内存数据,那这个内存呢,大家就当成一个map就行了,而且呢,因为我们这个服务器浏览器可能有很多,比如我在用,张三李四都在用,他们呢都在访问我们这个商城,假设我们商城就这一个服务器,所以呢,我们这个商城服务器为了保存张三李四王五这些用户的。
04:37
状态,那它里边呢,会为每一个用户创建一个session对象,这个session对象大家就当成一个map,所有的session服务器也都会管起来,所有的session呢,全部放在服务器的一个,我们称为叫session manager,我们的session管理器里边,好,我们假设呢,第一个人我们他使用他自己的浏览器,我们来进行登录,登录成功了,我们服务器呢,保存一下这个用户的状态,把这个用户信息全部保存在session里边,我们就创建了一个session,然后呢,我们浏览器。
05:10
怎么下一次知道它是登录的哪个用户,那我们创建好session以后,我们会命令浏览器保存一个cookie,我们cookie呢,比如名叫解ID,值呢是一个值,这个就类似于大家去银行去来存钱,那我们第一次呢,去工商银行来存钱,那我们为了银行标识我们是哪个人,那么银行为我们办一张银行卡,那以后呢,我们存的这些钱都是对应这个银行卡账号下边的,我们下一次我们就相当于浏览器,那下次去这个银行,无论是取钱办业务,能带上这个银行卡就行了,那么这个session也一样,我们服务器呢,登录成功,将这个用户保存在session里边,然后呢,我们服务器给他办一个银行卡,我们假设呢,就是这个卡卡号呢是123,这个卡里边能存很多数据,KVKV都是按照KV来存储的,好,然后呢,我们把这个卡号发给我们浏览器,然后呢,浏览器收到了这个银行卡。
06:10
好叫123浏览器呢,就会乖乖保存,那只要他保存成这个cookie以后,以后浏览器只要访问我们这个网站,都会带上我们这个网站发给他的银行卡,当然我们去工商银行带着农业银行卡肯定没什么用,所以我们都是访问哪个服务器,就带这个服务器给我们发的所有这些卡,所以呢,我们这个服务器呢,给他之前发了一个123这个卡,我们只要以后带上们假设呢,给123里边这个用户登录成功了,我们是这么来处理的,我们拿到他的这个session,每一个session呢,都有一个ID session就是一个银行卡,这个银行卡呢,都有一个ID,银行卡号,卡号呢已经发给浏览器了,浏览器下次带上,我们想要获取session,我们在这儿呢,要获取session,服务器呢,就会根据浏览器带来的这个卡号,卡号呢他带了一个123,比如他访问cookie的时候,他访问服务器带了一个解session ID是123,带上了123。
07:10
办卡号,那我们的服务器就会找到这个银行卡123,那它里边到底存了哪些,给我们服务器存了哪些,我们都知道,那么当时呢,存了一个K叫Logan user,所以呢,我们服务器想要知道,那我们就在123这个卡片里边来找,诶他当时存了一个Logan user,就叫U吧,好,我们存的这个用户信息我们全部能拿出来,我们想要在页面获取,那我们直接在页面展示就行了,服务器把页面一渲染,在这页面里边来取出相应的值,但是呢,这是一个常规的流程,我们这一块呢,已经完全变了,我们现在登录是在author服务器来进行登录的,我们可以看一下,比如我来跳转到我们的这个登录一下我们这个author服务器,我们跳到这儿,我来F12来看发没发这个卡,我们在cookie里边来看一下,我发现呢,Also这个域名已经发卡了解session ID卡号是这个,我把这个图呢,我来截下来,那而且呢,我发的这个卡。
08:10
大家注意,每一个卡号都有它的作用域,就是这个do域名,相当于呢,我们能只能在我们这个域名下生效,好,我来复制一下,把这个放在这儿,那现在呢,默认发了一张卡是这样子的。那浏览器我们登录成功以后,我们现在是发卡了,我们给session里边保存用户了,我们也发卡了,那登录成功以后呢,我们又跳回来了,我们来看跳回来到古力m com,相当于跳回到我们这个域名下了,那我们这个域名下有没有卡呢?发现没有卡就相当于我们只要域名不一样,那默认他们这个东西呢,就是不一样的,首先这就是我们说的工商银行农业银行各种区别,每一个银行只发自己的卡,那相当于我们浏览器在访问古M这个域名的时候,我们下一次在这访问,好,下一次访问我们想要带卡,但是呢,在我们这个古lymail这个域名下没卡,我们上次登录呢,是在also古lymail下,我们登录成功,我们创建的卡,所以呢,现在就导致了一个问题,如果我们使用session的话。
09:19
我们是不同域名,那我们session肯定不能跨不同域名来共享,好我们来说第一个我们session的问题,我们不能跨不同域名共享啊,不能我们这个跨不同域名进行共享,不能跨不同域名共享,这是第一个问题,那我们即使没有来到分布式情况下,我们应用还没复制多份,我们只是呢,使用不同域名来部署我们多个微服务,那首先呢,Session就不能用了,它就会带来这个问题,那么再来考虑一个问题,假设呢,我们解决了这个问题,还会有一个问题,那什么问题呢?我们来看一下,我们呢,如果是一个不同域名情况下,我们不同服务,假设我们这个会员服务,我们的登录服务跟我们的商品服务,我们现在呢,是不同服务部署了不同域名,那不同域名下呢,我们这个卡号没有能共享,没办法,所以我们session不能共享,但即使我们是同域名下。
10:20
都有可能有问题,假设呢,都是会员服务,好假设都是我们的登录认证服务,那们都是访问also点古励mail,我们都访问这个域名,它呢也访问also.googlemail那如果在我们分布式情况下,我们除了我们这个服务我们分布部署外,首先我们这个会员服务我们不可能只部署到一台服务器上,那们可能呢,多台服务器同时都有我们这个会员服务,以前的session呢,默认都是我们服务器里边的一片内存空间,我们说大家就把它当成一个map,其实它底层就是一个map,好然后呢,那接下来假设我们浏览器第一次登录,第一次登录请求呢,落在了我们一号服务器,那登录成功了,我们一号服务器把我们的用户保存了,相当于我们一号服务器在他自个儿的内存空间里边存了一个用户信息,但是呢,由于我们现在是分布式集群环境,那我们下一次请求再进来,再进来呢,我们落到了二号服务器那。
11:20
由于我们带了这张卡,好,假设第一次进来我们同样的域名都是工商银行发了一个卡,卡号呢叫123,下次呢,我们跑工商银行带了这个123卡号,但是呢,我们现下一次跑到了另外一个工商银行,我们跑到了二号服务器,然后这个工商银行呢,说你这个卡是别的工商银行发的,我这儿不能用,这又是一个问题,问题呢是浏览器把卡带了,但是呢,我们来到第二个服务器,由于我们第一个服务器的内存存的数据,我们第二个服务器肯定不知道我们第一个服务器内存存了什么,所以来到我们第二个服务器,第二个服务器什么都没存,你即使带了一个正确的卡号,他呢也不能找到这个数据,这就是我们说的session,在我们这个集群环境,如果我们服务复制多份情况下,又有这么一个问题,就是我们说的session不同步问题,我们给第一个服务器存在session,第二个服务器不知道,那么负载均衡来到第二个服务器了,那又找不到了。
12:20
所以呢,现在我们如果要使用session,我们绝对得解决这两个问题,第一个问题就是我们即使是同域名下同域情况下,我们同一个服务情况下,我们如果服务复制多份session怎么办?因为第一个里边存的session,这是它的内存,在第二个里边没有,这是我们要解决的第一个问题。然后我们还要解决第二个问题,就是如果我们用了不同服务,相当于我们是用了不同银行,银行跟银行之间,我用一张工商银行卡,我去农业银行,去建设银行,我们到底能不能取钱,能不能做业务。所以呢,我们现在要解决我们第二个问题,我们不同服务,我们拥有了不同域名的情况下,我们session不能共享,所以呢,我们现在如果要使用session,我们只有解决了这两个问题,我们的认证服务器里边,我们登录成功,Session里边放的用户,我们才能在我们商品服务里边真正的从session里边取出来,那下一节课我们就来看一下这两个问题我们该如何解决。
我来说两句