传统单一服务器登录模式: 登录
(1)传统的方式:使用session对象实现
登录成功后,就把用户数据放在session里面
判断是否登录,从session获取数据,可以获取到登录信息,就是登录成功。
session.setAttribute("user",user); //将用户信息存放在session里面
session.getAttribute("user"); //得到session用户信息
(2)缺点:就是现在目前都是倾向于多台服务器,基本上企业都是使用微服务架构/分布式架构。这样的 话基本都是由每一个功能组成一个个小的微服务模块。每一个服务器都不一样,导致传统的方式session对象来实现,必须要实现每一个模块都要登录一次,这样很麻烦。
(3)举一个例子:在我们在百度首页网页进行个人登录后,我们再去浏览贴吧,文库,音乐…一系列的功能,都不需要登录。百度就好比我们的总项目,文库,音乐…就好比是我们的一个个微服务,只要我们在任意的微服务模块登录了,其他的模块就不需要登录,就可以直接浏览。这就是单点登录。
实现单点登录(sso):
单点登录说白了就是为了每一个模块在登录这一方面做到统一。一次登录,其他服务器(模块)都显示已经登录,不需要再一次登录。
(1)session 广播机制实现
就是session的复制。登录后账户的信息将set到session里面,
然后复制到每一个微服务的服务器上,每一个服务器都携带着该session,
通过session.get判断是否得到数据,如果为空就是没有登录。有数据就是登录过。
缺点:如果微服务的模块很少,也就是说白了功能很少的话,可以使用这个方法。如果是几十个的话,每一个模块都复制判断会带来数据的冗余和性能的消耗。
(2)使用cookie+redis实现
1.在项目的任何一个模块进行登录,登录之后,把数据放在两个地方
(1)redis: key:生成一个唯一随机值UID,就是为了唯一性。 value: 用户数据
(2)cookie : 在Redis里面生成的key放在cookie里
2.每一个浏览器的访问,都会携带着cookie,从cookie里面得到UID,
然后去redis里面查找。是否有相关的数据作为登录的依据。
(3)使用token来实现
1在项目某一个模块进行登录后,按照规则生成字符串,
把登录之后用户包含到生成字符串里面,把字符串返回。
(1)可以把字符串通过cookie返回
(2)可以在地址栏返回。可以参考类似的网站
2.再去访问某一个模块的时候,就会按照相关的规则解析相关的字符串,
看是否有相关的用户信息。