1.会话维持
那么,我们怎样用Cookies保持状态呢,当客户端第一次请求服务器时,服务器会返回一个请求头中带有Set-Cookie字段的响应给客户端,用来标记是哪一个用户,客户端浏览器会把Cookies保存起来。当浏览器下一次再请求该网站时,浏览器会把此Cookies放到请求头一起提交给服务器,Cookies携带了会话ID信息,服务器检查该Cookies即可找到对应的会话是什么,然后再判断会话来以此辨认用户状态。
在成功登陆某网站时,服务器会告诉客户端设置哪些Cookies信息,在后续访问页面时客户端会把Cookies发送给服务器,服务器再找到相应的会话从而加以判断。如果会话中的某些设置登录状态的变量是有效的,那就证明用户处于登陆状态,此时返回登录之后才可以看到的网页内容,浏览器再进行解析便可以看到了。
反之,如果传给服务器的Cookies是无效的,或者会话已经过期了,我们将不能继续访问页面,此时可能会收到错误的响应或者跳转到登录页面重新登录。
所以,Cookies和会话需要配合,一个处于客户端,一个处于服务端,二者共同协作,就实现了登录会话控制。
2.属性结构
我们再来看看Cookies都有哪些内容,以知乎为例,在浏览器开发者工具里打开Application选项卡,然后在左侧会有一个Storage部分,最后一项即为Cookies,将其点开,如下图所示:
可以看到,有很多条目,期中每个条目都可以称为Cookie,它有如下几个属性:
- Name:该Cookie的名称,一旦创建,便不可更改。
- Value:该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码。
- Domain:可以访问该Cookie的域名。例如,如果设置为.zhihu.com,则所有以zhihu.com结尾的域名都可以访问该Cookie。
- Max Age:该Cookie失效的时间,单位为秒,也常和Expires一起使用,通过它可以计算出其失效时间。Max Age如果为正数,则该Cookie在Max Age秒之后失效。如果为负数,则关闭浏览器时Cookie失效,浏览器也不会以任何形式保存该Cookie。
- Path:该Cookie的使用路径,如果设置为/Path/,则只有路径为/Path/的页面可以访问该Cookie,如果设置为/,则本域名下的所有页面都可以访问该Cookie。
- Size字段:此Cookie的大小。
- HTTP字段:Cookie的httponly属性。若此属性为true,则只有在HTTP头中会带有此Cookie的信息,而不能通过ducument.cookie来访问此Cookie。
- Secure:该Cookie是否仅被使用安全协议传输。安全协议有HTTPS和SSL等,在网络上传输数据之前先将数据加密。默认为false。
3.会话Cookie和持久Cookie
从表面意思来说,会话Cookie就是把Cookie放在浏览器内存里,浏览器关闭之后该Cookie即失效;持久Cookie则会保存到客户端的硬盘中,下次还可以继续使用,用于长久保持用户登录状态。
其实严格来说,没有会话Cookie和持久Cookie之分,只是由Cookie的Max Age或Expires字段决定了过期的时间。
因此,一些持久化登录的网站其实就是把Cookie的有效时间和会话有效期设置的比较长,下次我们再访问页面时仍然携带之前的Cookie,就可以直接保持登录状态。
4.常见误区
在谈论会话机制的时候,常常会听到这样一种误解——“主要关闭浏览器,会话就消失了”。可以想象我们平常生活中的会员卡,除非顾客主动对店家提出销卡,否则店家是不会轻易的删除顾客的资料的,对会话来说,也是一样,除非程序员通知服务器删除一个会话,否则服务器会一直保留。比如,程序一般都是我们做注销操作时才去删除会话。
但是当我们关闭浏览器时,浏览器不会主动在关闭之前告诉服务器它将要关闭,所以服务器根本不会有机会知道浏览器已经关闭,之所以有这种错觉,是因为大部分会话机制都是用Cookie来保存会话ID信息,而关闭浏览器Cookie就消失了,再次连接服务器时,也就无法找到原来的会话了。如果服务器设置的Cookies保存在硬盘上,或者使用某种方法改写浏览器发出的HTTP请求头,把原来的Cookies发送给服务器,则再次打开浏览器,仍然能够找到原来的会话ID,依旧还是可以保持登录状态的。
而且恰恰关闭浏览器不会导致会话被删除,这就需要服务器为会话设置一个失效时间当距离客户上一次使用会话的时间超过这个失效的时间时,服务器就可以认为客户端已经停止了活动,才会把会话删除以节省存储空间。
好了,在阅读了这两篇博文后,相信你对会话和Cookies有了深层次的理解,技术是没有止境的,只有不断钻研,不断进步,我们的人生价值才能体现出来,继续努力吧!