我们都知道http协议的特点是:无连接、无状态。
所谓的无状态,就是指服务器不记录用户的信息,对于事务处理没有记忆能力,无法根据之前的状态进行本次的请求处理。那么举个例子,小美在某宝购买了一台电脑,她想要继续购物时,此时服务器需要记住小美的信息,思考一下怎样才能让服务器记住小美的信息呢?
这样就引入今天的主题:状态保持
状态保持的方法有两种:cookie+session实现和token实现
一.cookie+session实现
首先我们来复习一下cookie和session的概念
cookie:
Cookie是由服务器端生成,发送给浏览器,浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时自动发送该Cookie给服务器
Cookie可以用来在某个WEB站点会话间持久的保持状态
session:
Session是另一种记录客户状态的机制,基于Cookie实现,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是Session,客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
通过cookie和session的了解,我们可以看出Cookie的本质就是文件,一般放在请求头里,保存在浏览器上。
由于cookie并不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
并且session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
所以综合考量我们通常使用cookie+session共同完成状态保持。具体实现如下图所示:
二、token实现
JWT:是json web token的缩写,主要分为三部分:头部(header)、载荷(payload)和签名(signature)。如图:
三部分的对比我们画图来看:
如上图,由于jwt中头部和载荷都既可以加密也可以解密,所以我们一般使用签名来完成保持状态。具体方法为:
头部+载荷+头部里的加密方式+随机字符串
其中 头部+载荷 属于原始数据 ,头部里的加密方式实际上就是一个字符串 也是透明的,
而随机字符串只有后台知道,保证了唯一性和正确性。
登录实现流程如下:
实现功能需要借助: