HTTP状态保持

1、为什么需要对http进行状态保持

HTTP协议本身是无状态的,无状态的意思是浏览器发起的每个HTTP请求,对于服务端而言都是彼此独立的,即服务端无法直接通过HTTP协议将用户的多次HTTP请求联系在一起。这就好比顾客跟自动售货机的关系一样,无论你在一台自动售货机上购买了多少次商品,自动售货机都没法“记住”你,也就是说你每一次在该售货机上购买商品的时候,自动售货机都会把你当成一个陌生的顾客来对待。

随着Web应用的复杂,很多场景下需要维护用户状态才能正常工作。典型的应用就是购物车。当你在网上商城购买商品的时候,每看到一个喜欢的商品可以把它先加入购物车,然后继续浏览其他商品,等浏览完商品后再进行商品的结算。在这个过程中,你与服务器的通信是通过多次HTTP请求完成的,浏览器必须通过某种机制识别出你发出的所有HTTP请求是来自同个计算机的同个浏览器,或者来自同一个账户。否则服务器就没办法将购物车里的商品跟某个人联系起来,因此也无法实现购物车功能。这种维持HTTP状态的机制就是会话机制。

2、对http进行状态保持的发展历

(1)、基于Session实现会话保持

基于Session实现会话保持的原理是:在会话的开始(即客户端第一次向服务器发送HTTP请求时),服务器会将会话状态保存起来(一般保存在本机内存,当然也可以保存在其他存储系统),然后分配一个会话标识(也叫SessionId)给客户端,这个会话标识一般保存在浏览Cookie里,以后每次浏览器发送HTTP请求的时候,都会带上这个会话标识到服务器,服务器拿到这个会话标识之后就可以把之前存储在服务端的状态信息与该会话联系起来,因此也就实现了会话保持。当然如果遇到浏览器禁用了Cookie的情况,则可以通过url重写的方式将会话标识放在url的参数里,这样也可以实现会话保持。

但是通过session的方式来实现会话的保存有个致命的问题:在做负载均衡的时候如何在多台服务器之间保存session的问题,为了解决这个问题出现了很多种方案。

在这里插入图片描述
这种方案是通过在不同服务器之间复制session来解决session的问题,但是这种方案在机器非常多的时候就很难实现,需要复制很多次,于是就出现了以下方案。

在这里插入图片描述
在一个地方将session统一管理,所有的服务器都访问这个session,开发者发现服务端来维护这个会话太麻烦,于是就把会话的管理交给了前端。

(2)、基于Cookie实现会话保持

基于Cookie实现会话保持与上述基于Session实现会话保持的最主要区别是前者完全将会话状态信息存储在浏览器Cookie中,这样一来每次浏览器发送HTTP请求的时候都会带上状态信息,因此也就可以实现状态保持。以上述购物车应用为例,服务端可以将商品信息加密(也可以不加密,但为了安全性,一般会此对状态信息进行加密处理)后保存在浏览器的Cookie中,这样一来服务端就能知道你在浏览的过程中添加了哪些商品到购物车中了。

cookie其实就是浏览器本地存储数据的一种实现,那么把会话存储在浏览器其实是很不安全的。

不管cookie还是session其实都是用存储的方式来解决这个问题,说白了其实就是需要一种验证用户操作的合法性的问题,最后token通过签名的方式解决了验证的问题,其实本质是用时间换取了空间的方式解决的。

(3)、token的验证方式
在这里插入图片描述
在用户登陆成功后将用户的userid用加密算法生成token,然后下发给客户端,客户端每次请求都会带上这个token,然后服务端拿到这个token会做验证。
在这里插入图片描述
总体思路:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章