单一服务器模式:
- 使用session对象实现
- 登陆成功之后,把用户数据放到session中 session.setAttribute("user",user)
- 判断是否登陆,从session获取数据,可以获取到登陆 session.getAttribute("user")
- 缺点:单点性能压力,无法扩展
集群(分布式)部署模式:
- 单点登陆SSO:一个项目拆分成了许多子模块分别部署在各自的服务器中,单点登陆就是指在一个业务模块登陆了之后,其他模块都会实现登陆功能。例如:百度有百度贴吧和百度文库,登陆了百度贴吧后百度文库也是登陆了。
SSO(Single sign on )模式就是单点登陆模式,三种常见的方式
- session广播机制
- 本质上是session复制
- 缺点:资源浪费、数据冗余
- 使用cookie+redis
- 建立一个认证服务器,当其他服务需要登陆操作的时候就带着登陆后需要重定向的地址转发到认证服务器上进行登陆,登陆成功后设置一个uuid或者由ip、用户id等等随机生成的token,将token保存到cookie中,并将这个token和对应的用户信息以key-value的形式保存到redis中,并带着token重定向到指定url。
- 需要登陆的服务器拿到认证中心返回来的token,将这个token也保存到cookie中,并向redis查询出对应的用户信息保存到自己的session或cookie中完成登陆。
- 因为浏览器每次发送请求都会带着cookie去发送,因此在用户登陆成功后每次请求都带着token,所以可以通过服务器端建立一个filter来判断是哪个用户发送的请求。
- 当其他未登录的模块需要登陆的时候,也转发请求带着回调地址发送给认证中心,如果认证中心cookie中有其他已登录模块存留的cookie那么认证中心就将这个token返回给该模块,该模块拿到后再根据token找redis拿用户数据,将token和数据存到自己的cookie或者session中,完成登陆。
- 这样就实现了多个微服务之间的单点登陆的操作。
- 使用token(令牌)实现:token是指按照一定的规则生成的字符串,字符串可以包含用户信息
- 在项目某个模块登陆后,按照规则生成字符串,把登陆之后的用于包含到这个字符串中,把字符串返回
- 将token存到浏览器中,每次请求可以带着token到服务器端
- 也可以将token放到地址栏内,返回到服务器
- 服务器收到token进行解码,提取信息,判断是否登陆