HTTP协议特性
HTTP协议对于事务的处理是没有记录能力的,也就是服务器不知道客户端是什么状态
意味着如果后续需要处理前面的信息,需要重传
这会导致重复传递一些信息,才能获取响应, 此时就需要session和cookies,
session和cookies
session在服务端,用来保存用户的session信息;Session,中文称之为会话,其本身的含义是指有始有终的一系列动作 / 消息。比如,打电话时,从拿起电话拨号到挂断电话这中间的一系列过程可以称为一个 Session。
而在 Web 中,Session对象用来存储特定用户 Session所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session对象中的变量将不会丢失,而是在整个用户 Session中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有 Session,则 Web 服务器将自动创建一个 Session对象。当 Session过期或被放弃后,服务器将终止该 Session。
cookies在客户端,即浏览器端,浏览器在下次访问网页时会自动附带上它发送给服务器,服务器通过识别cookies并鉴定出是哪个用户,然后判断用户的登录状态进而给出对应的响应。
Cookies 指某些网站为了辨别用户身份、进行 Session跟踪而存储在用户本地终端上的数据。
Session维持
那么,我们怎样利用 Cookies 保持状态呢?当客户端第一次请求服务器时,服务器会返回一个响应头中带有 Set-Cookie 字段的响应给客户端,用来标记是哪一个用户,客户端浏览器会把 Cookies 保存起来。当浏
览器下一次再请求该网站时,浏览器会把此 Cookies 放到请求头一起提交给服务器,Cookies 携带了 Session ID 信息,服务器检查该 Cookies 即可找到对应的 Session是什么,然后再判断 Session来以此来辨认用户状态。
在成功登录某个网站时,服务器会告诉客户端设置哪些 Cookies 信息,在后续访问页面时客户端会把 Cookies 发送给服务器,服务器再找到对应的 Session加以判断。如果 Session中的某些设置登录状态的变量是
有效的,那就证明用户处于登录状态,此时返回登录之后才可以查看的网页内容,浏览器再进行解析便可以看到了。
反之,如果传给服务器的 Cookies 是无效的,或者 Session已经过期了,我们将不能继续访问页面,此时可能会收到错误的响应或者跳转到登录页面重新登录。
所以,Cookies 和 Session需要配合,一个处于客户端,一个处于服务端,二者共同协作,就实现了登录 Session控制。
常见误区
在谈论 Session机制的时候,常常听到这样一种误解 ——“只要关闭浏览器,Session就消失了”。可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对 Session来说,也是一样,除非程序通知服务器删除一个 Session,否则服务器会一直保留。比如,程序一般都是在我们做注销操作时才去删除 Session。
但是当我们关闭浏览器时,浏览器不会主动在关闭之前通知服务器它将要关闭,所以服务器根本不会有机会知道浏览器已经关闭。之所以会有这种错觉,是因为大部分网站都使用会话 Cookie 来保存 Session ID信息,而关闭浏览器后 Cookies 就消失了,再次连接服务器时,也就无法找到原来的 Session了。如果服务器设置的 Cookies 保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP 请求头,把原来的 Cookies发送给服务器,则再次打开浏览器,仍然能够找到原来的 Session ID,依旧还是可以保持登录状态的。
而且恰恰是由于关闭浏览器不会导致 Session被删除,这就需要服务器为 Session设置一个失效时间,当距离客户端上一次使用 Session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把 Session删除以节省存储空间。