session
http协议是面向无状态无连接的,所以当用户登入之后需要用session记录用户的登入状态,服务端储存一个session,用户端也存放一个cookie,其中存放sessionID
当用户再次访问时,根据session可以判断用户登录状态以及用户信息。
在单点登录状态下,只有一台服务器。
当多台服务器出现时,会出现nginx来进行分发请求,进行负载均衡,就会出现问题,此时一个服务器存储着用户的session,而其他服务器没有存储用户的session。当用户请求过来时,通过nginx将不同用户的请求分发到不同的服务器上面,此时就会出现其他服务器没有用户session。
解决办法:
一,session黏贴:将对应客户端ip的请求只打到对应的服务器。缺点:分布式系统的好处就在于,一台服务器挂了可以把请求打到其他服务器上面。这样的话,这台服务器挂了,这个客服端的登入信息就会消失。
二,将session同步到其他服务器上。缺点:可能出现同步不及时,此时用户请求已经过来,但是这个服务器还没有同步过来,将会出现判断用户未登入。而重新生成新的session。这时复制的session也过来了,就会出现session混乱、
三,将session放到redis上面集中存储。缺点:服务器越来越多,造成redis压力很大
基于无状态的token方式
有用户请求请求到nginx,nginx将请求放到服务器上面,在服务器上面登录后会生成一个token,这个token会保存用户的全部信息,将这个token返回给用户,这样不在服务器上面存放用户信息,服务器的状态变化就对用户没有影响
缺点:用户信息全部放在用户端,可能会造成用户信息的泄露。
网络传输不安全可能会造成用户信息的泄露
解决办法:中间加一个层
综上
单点登入会选择session
分布式情况会选择token