1、HTTP的无状态协议
HTTP无状态协议
是指该协议对事件的处理过程没有记忆能力,当后续的步骤需要上一步的信息时,则需要重传,即需要携带上一次的信息。
因此,对于存在依赖性的访问请求,则下一次的传递需要携带上一次传递的信息,依次不断的叠加,会导致传输的信息量会越来越大,服务器响应较慢。
HTTP无状态访问
在90年代,浏览器刚出现的时候,它的作用也仅仅是浏览一些文本而已,彼此之间不存在依赖关系(在后面的学习中,我们把这种依赖关系
理解为会话
)。因此,服务器不需要做任何的记录,浏览器请求什么,服务器就返回什么,彼此之间清清楚楚,不存在任何的爱恨情仇,双方的关系非常的融洽。
随着技术的发展,特别是当客户端与服务器进行动态交互的Web应用程序出现之后,HTTP的无状态特征严重影响了这类Web应用程序,Web应用的交互是双向,需要承前启后的,总不能每次都失忆。
就像夏洛特烦恼中,夏洛和大爷的对话:
夏洛:大爷,楼上322住的是马冬梅家吗?
大爷:马冬什么?
夏洛:马冬梅。
大爷:什么冬梅啊?
夏洛:马冬梅啊。
大爷:马什么梅啊?
夏洛:……行,大爷,您先凉快吧。
如简单的购物车程序也要知道用户到底在之前选择了什么商品,总不能所有用户都使用一个购物车吧,所以需要把每个用户都区分开,服务器需要记录每个用户的会话,又因为HTTP是无状态的,那么就要想办法为每个用户保持一个会话。
因此市面上出现了两种保持HTTP连接状态的技术:Cookie
和Session
。
Cookie是客户端
保持HTTP会话状态的技术,而Session是服务端
保持HTTP会话状态的技术。通常情况下,这两种技术是结合使用的。
下面,我们将分别学习Cookie、Session,并针对它们的不足,学习Token的原理与使用。
2、Cookie
在学习Cookie之前,我们先考虑以下问题:
(1)什么是Cookie,Cookie的作用是什么?
(2)Cookie的工作机制是什么?
(3)Cookie的基本属性有哪些?
针对上面的问题,我们一一来做解答。
2.1 Cookie的原理及工作机制
按照官方的定义:
Cookie是保存在客户端浏览器中的文本文件(key-value形式),这个文件与访问的特定的Web页面(文档)关联在一起,并且保存在本地的客户端中,Cookie 最根本的用途是帮助 Web 站点保存有关访问者的信息。
举个例子,当客户端浏览器访问服务端时,服务端会记录每个用户的访问信息并以Cookie文件
的形式保存在客户端,当用户再次访问服务端的特定页面时,服务端会首先检查客户端携带的Cookie中的用户身份信息,从而保持了会话的进行。
什么意思呢,我们举个生活中的例子:
当我们去银行办理储蓄业务时,柜员第一次给我们办了张银行卡,里面存放了身份证、密码、手机等个人信息。当我们下次再来这个银行时,银行机器能识别这种卡,从而能够直接办理业务。
那么问题来了,Cookie到底是如何起作用的呢?
事实上,当用户每次访问服务器时,Web应用程序都可以读取Cookie包含的信息,当用户再次访问该页面时,浏览器就会在本地硬盘上查找与该URL相关的Cookie,如果该 Cookie 存在(Cookie在不过期的情况下),浏览器就将它添加到request header
的Cookie
字段中,与http请求
一起发送到该站点。
我们以登录为例:
实现登陆我们就必须需要cookie, 使用 cookie 来保存用户的信息。
在请求某个域的时候,http 会自动将这个域的 Cookie 放到请求头当中。所以我们只需要在登陆用户成功后,将必要的信息通过设置 Set-Cookie 这个响应头返回给客户端。
浏览器会自动将该头的信息存储到当前域名下的 Cookie 中,当下次用户请求的时候,http 协议会自动将该 cookie 带上。我们就可以在每次的请求的请求头当中拿到该 Cookie, 然后去判断用户是否登陆,进而根据用户是否登陆进行相