http无状态协议如何保存用户状态

http无状态协议如何保存用户状态

  • http无状态协议如何保存用户状态?

http无状态协议如何保存用户状态?

HTTP 是一种不保存状态,即无状态(stateless)协议。HTTP 协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理

http无状态协议如何保存用户状态_第1张图片
常见的有以下两种解决方案:

  1. 基于Session实现的会话保持
    在会话开始时(客户端第一次像服务器发送http请求),服务器将会话状态保存起来(本机内存或数据库中),然后分配一个会话标识(SessionId)给客户端,这个会话标识一般保存在客户端Cookie中,以后每次浏览器发送http请求都会带上Cookie中的SessionId到服务器,服务器拿到会话标识就可以把之前存储在服务器端的状态信息与会话联系起来,实现会话保持(如果遇到浏览器禁用Cookie的情况,则可以通过url重写的方式将会话标识放在url的参数里,也可实现会话保持)
  2. 基于Cookie实现的会话保持
    基于Cookie实现会话保持与上述基于Session实现会话保持的最主要区别是前者完全将会话状态信息存储在浏览器Cookie中,这样一来每次浏览器发送HTTP请求的时候都会带上状态信息,因此也就可以实现状态保持。

两者优缺点

  1. 基于Session的会话保持优点是安全性较高,因为状态信息保存在服务器端。缺点是不便于服务器的水平扩展。大型网站的后台一般都不止一台服务器,可能几台甚至上百台,浏览器发送的HTTP请求一般要先通过负载均衡器才能到达具体的后台服务器,这就会导致每次HTTP请求可能落到不同的服务器上,比如说第一次HTTP请求落到server1上,第二次HTTP请求落到server2上。而Session默认是存储在服务器本机内存的,当多次请求落到不同的服务器上时,上述方案就不能实现会话保持了(常用解决方案是中间件,例如Redis,将Session的信信息存储在Redis中,这样每个server就都可以访问到)。
  2. 基于Cookie的会话保持的优点是服务器不用保存状态信息,减轻服务端存储压力,也便于服务端做水平扩展。缺点是不够安全,因为状态信息是存储在客户端的,这意味着不能在会话中保存机密数据,另一个缺点是每次HTTP请求都需要发送额外的Cookie到服务端,会消耗更多带宽。

参考:https://blog.csdn.net/hzjjames/article/details/81143934
参考:图解http 链接:https://pan.baidu.com/s/1VtKk1E9TpRzvi6XLWLQM9A
提取码:pn3z

你可能感兴趣的:(计算机网络)