HTTP无状态协议以及其解决方案

一、无状态的理解
1、协议对事物处理没有记忆能力
2、对同一个url请求没有上下文关系
3、每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求无直接关系,它不会受前面的请求应答情况影响,也不会影响之后的请求应答情况
4、服务器中没有保存客户端的状态,客户端每次需带上自己的状态去请求服务器
二、通俗理解
标准的http协议指的是不包括cookies,session,application的http协议
无状态是指没有对本次客户端在和服务器会话设置一个缓存区,用来记录这次会话的状态和产生的数据,缓存区包括客户端(Cookie)和服务端(Session)

例子理解:假设没有cookie和session,当一个用户网上购物时会发生的情况,前提用户已经注册,数据库中包含用户信息

1、用户登录
用户通过http把用户的用户名和密码发给服务器,服务器把他们跟自己存有的用户资料对比,如果一致返回信息登录成功

2、然后用户点击某一个商品网页
相当于输入一个商品页的网址,假设商品页比较机密不对外公开,需要是用户才能访问,虽然http能传送用户名和密码,而且刚才也输入了,还验证成功,但是因为服务器既不会记得你登录的状态,客户端也不会存储你刚才输入的用户名和密码,所以因为这一次访问无法确定你的身份,只能访问失败。

问题:用户登录后,切换到其他界面,进行操作,服务器端无法判断是哪个用户登录的。每次进行页面跳转的时候,得重新登录。

三、解决方案
既然HTTP协议是无状态的,不会记录用户信息,那么如何才能让HTTP协议记录用户信息呢?
(1)于是,两种用户保持HTTP状态的技术应运而生,一个是Cookie,另一个是Session。
(2)HTTP/1.1持久连接(HTTP keep-alive)方法,只要任意一端没有明确提出断开连接,则保持TCP连接状态,在请求首部字段中的Connection: keep-alive即为表明使用了持久连接

1、Cookie

Cookie是客户端的存储空间,由浏览器来维持。具体来说Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器,是一种在客户端保持状态的方案。

Cookie指某些网站为了辨别用户身份、进行session跟踪而存储在用户本地终端上的数据(通常经过加密)。

Cookie的实现过程:
Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通过客户端保存Cookie, 当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送过去。

Cookie是服务器生成的,但是发送给客户端,并由客户端保存。客户端再次请求该服务器时,客户端自动将Cookie加入请求报文中,服务器端发现客户端发送过来的Cookie后,会去检查从哪一个客户端发送过来的连接请求,然后对比服务器上的记录,最后得到之前的状态消息。

2、Session

Session(会话),是另一种记录客户状态的机制,不同的是Cookie是保存在客户端浏览器的,而Session是保存在服务器上的。

客户端浏览器第一次访问服务器时,服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。

虽然Session保存在服务器上,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为标志。HTTP协议是无状态的,Session不能根据HTTP连接来判断是否为同一客户,因此服务器向客户端发送一个名为JSESSIONID的Cookie,它的值为该Session的id(即放在HTTP响应报文头部信息里的Set-Cookie)。Session依据该Cookie来识别是否为同一客户。
HTTP无状态协议以及其解决方案_第1张图片
3、Cookie和Session的区别

  1. Cookie数据保存在客户端的浏览器上,Session数据放在服务器上;
  2. 单个Cookie在客户端的限制是3k,也就是说一个站点在客户端存放的COOKIE不能超过3K
  3. Cookie 不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
  4. Session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。

四、总结
Cookie 和 Session 的方案虽然分别属于客户端和服务端,但是服务端的 Session 的实现对客户端的 Cookie 有依赖关系的,上面我讲到服务端执行 Session 机制时候会生成 Session 的 id 值,这个 id 值会发送给客户端,客户端每次请求都会把这个 id 值放到 http 请求的头部发送给服务端,而这个 id 值在客户端会保存下来,保存的容器就是 Cookie,因此当我们完全禁掉浏览器的Cookie的时候,服务端的Session也会不能正常使用。

参考文章:
HTTP协议为什么是无状态的?如何让HTTP“有状态”?

http无状态

Cookie和Session的区别

你可能感兴趣的:(HTTP协议,高级编程,找工作)