在此前的HTTP中,曾谈到过HTTP是一种无状态的连接,这种协议对于事务处理没有记忆能力,对同一个url请求没有上下文关系,而且每次请求都是相对独立的,它不会受前面请求的影响而影响本次请求的结果,因为服务器并不会保存客户端的状态,那么客户端必须每次带上自己的状态去请求服务器,这样服务器才能认出你是谁。
举个简单的例子吧:
若为有状态的:
B:我叫kingbora,我需要存放我的背包。
S:好的。
B:我来取我的背包。
S:好的。
复制代码
若为无状态的:
B:我叫kingbora,我需要存放我的背包。
S:好的。
B:我来取我的背包。
S:你是谁?你的背包是哪个?。
复制代码
那么上面的例子上所需要的状态便是用户的身份,如果每次请求不带上这个身份,服务器无法识别用户身份,也就无法返回正确的信息。但是目前的HTTP都是有状态的,主要是因为引入了Cookie和Session机制,来实现HTTP请求的状态保持。
一、Cookie、Session
1.1 Cookie机制
理论上,一个用户所有的请求操作都应该属于同一个会话,每个会话之间相互独立互不影响。 HTTP协议是无状态的,一旦数据交互完毕,客户端和服务器之间的连接就会关闭,再次交换时需要重新建立新连接,也就意味着服务器无法从连接上跟踪会话。那么若想跟踪次会话,就需要引入Cookie这种会话机制。Cookie保存在客户端,具有不可跨域访问和操作的特性,而且还能设置有效期等等,
1.2 Session机制
Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单,但也相应增加了服务器的存储压力。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,也就是Session,下次访问时只需要从该Session中查找该客户的状态就好。
如果说Cookie机制是通过检查客户身上的"通行证"来确定客户身份的话,那么Session机制就是通过检查服务器上的"客户明细表"来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就行。
多个客户端执行程序时,服务器会保存多个客户端的Session。获取Session的时候也不需要声明获取谁的Session。Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见。Session一般存放在服务器短的内存中,而且Session可以通过特殊的方式做持久化管理。