目录
一、理解Cookie
HTTP协议自身是属于“无状态”协议。
无状态的含义指的是:默认情况下HTTP协议的客户端和服务器之间的这次通信和下次通信之间没有之间的关系。
但是实际开发中,我们很多时候是需要知道请求之间的关联关系的。
例如登陆网站成功后,第二次访问的时候服务器就能知道该请求是否是已经登陆过了。
上述图中的令牌通常就存储在Cookie字段中。
例子:比如去医院挂号
- 看病之前先挂号,挂号的时候需要提供身份证号,同时得到一张就诊卡,这个就诊卡就相当于患者的令牌。
- 后续去各个科室进行检查,诊断,开药等操作,就不必再出示身份证了,只要凭就诊卡即可识别出当前患者的身份。
- 看完病之后,不想要就诊卡了,就可以注销这个卡,此时患者的身份和就诊卡的关联就销毁了(类似于网站的注销操作)
- 又来看病,可以办一张新的就诊卡,此时就得到了一个新的令牌。
此时在服务器这边就需要记录令牌信息,以及令牌对应的用户信息,这就是Session机制所做的工作。
二、理解Session
我们先来了解什么是会话。
会话是一个客户与服务器之间的不中断的请求响应,对客户的每个请求,服务器能够识别出请求来自同一个客户,当一个未知的客户向Web应用程序发送第一个请求时就开始了一个会话,当客户明确结束会话或服务器在一个时限内没有接受到客户请求时,会话就结束了。
服务器同一时刻收到的请求是很多的,服务器需要清楚的区分每个请求是属于哪个用户,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系。
Session是服务器为了保存用户信息而创建的一个特殊的对象。
SessionId是由服务器生成的一个“唯一性字符串”,从Session机制的角度来看,这个唯一性字符串称为“Sessionid”。
上图很好的解释了服务器同一时刻可以接受很多请求,而且能够分清楚收到的请求属于哪个客户发来的,是因为服务器生成了一个SessionId,然后返回给客户端,返回就带有这个SessionId,也就是所说的“令牌”。
Session的本质就是一个哈希表,存储了一些键值对结构,Key就是SessionId,Value就是用户信息。
- 当用户登陆的时候,服务器在Session中新增一个新纪录,并把SessionId返回给客户端。(通过HTTP响应中的Set-Cookie字段返回)。
- 客户端后续再给服务器发送请求的时候,需要再请求中带上SessionId。(通过HTTP请求中的Cookie字段带上)。
- 服务器收到请求之后,根据请求中的SessionId在Session信息中获取对应的信息,再进行后续操作。找不到则重新创建Session,并把SessionId返回。
注意:Session默认是保存在内存中的,如果重启服务器则Session数据就会丢失。
三、Cookie和Session的区别
- Cookie是客户端保存用户信息的一种机制,Session是服务器保存用户信息的一种机制。
- Cookie和Sessio