关于Cookie的思考
Cookie是什么?
Cookie产生的背景是源于年代并不久远但是却很经典的HTTP协议在互联网上的急速发展。互联网之所以成功很大程度上取决于传输协议HTTP协议的两大特性:
1、 简单。这个没什么可多说的。简单就是美,复杂的东西总是难以流行,想想古语所说阳春白雪和下里巴人就明白了。
2、 无状态。无状态意味着服务器可以满足更多次的请求,这在成天嚷着要带宽的互联网发展初期是确保www成功的重要特性。
但是到了互联网的深层次发展,带宽等限制不存在了,人们需要更复杂的互联网交互活动,就必须同服务器保持活动状态。于是,在浏览器大发展初期,适应人民群众的需求,技术上推出了各种保持web浏览状态的手段,其中就包括了Cookie技术。
总体上,按照状态保持存储信息的主要位置来讲,状态保持分为:
1、 服务器端存储状态数据。如通常意义上的session
2、 客户端保持存储,cookie技术和web页隐藏字段以及URL串存储。都是主要数据存储在客户端或者发往客户端的信息流中(HTML流),每一次客户汇报存储的数据提交给服务器,让服务器知道自己上一次访问服务器时候的状态。
3、 第三地存储。例如数据库存储会话数据,基本上是1的变种
cookie的存储和传输
关于cookie的规范可以查找:
http://www.w3.org/Protocols/rfc2109/rfc2109.txt
cookie实际上是一段经过了编码的字符串,具体来讲存储cookie的实际过程是以 key=value的形式存储的,而且一个cookie为一个连续的字符串,每一个key之间“;”分隔,cookie之间则以#分割。
在Http的header中,cookie被传输,按照如下的格式:
set-cookie = "Set-Cookie:" cookies
cookies = 1#cookie
cookie = NAME "=" VALUE *(";" cookie-av)
NAME = attr
VALUE = value
cookie-av = "Comment" "=" value
| "Domain" "=" value
| "Max-Age" "=" value
| "Path" "=" value
| "Secure"
| "Version" "=" 1*DIGIT
Cookie是同站点密切相关的,也就说,你的站点发放的Cookie是不会通过IE/NE等发送给其他的站点。这些浏览器是通过web站点来区分的。具体的是host来区分的。但是如果你指定了domain的属性,情况就不同了。那么只有指定domain的站点以及子站点(下级域名,注意还是域名)可以看到此cookie.
通常在IE中,Cookie是存放在IE进程的共享内存的。也就说,只要是统一进程的IE窗口,同一站点的cookie是共享的。
Cookie的消灭
直接给cookie赋””值是错误的,应当指示cookie的Max_age(ie是exprise)为一个过去值。譬如1980-1-1,这样,浏览器发现了这样的Cookie后就不会保存在内存中(更不会在辅存)这样才算清掉了cookie。我今天就遇到了这样的情形:
我在服务器端设置失效期限为当前时间(那么理论上当语句执行完毕cookie就已经过期了),但是发送回客户端后,并没有(客户端时间之后服务期时间)。客户浏览器会认为这个cookie还有效而继续保持,在下一次提交时刻仍然提交到服务器,造成了逻辑处理上误解。
引用一篇关于asp.net的cookie的技术文章
http://www.microsoft.com/china/msdn/library/webservices/asp.net/asppcookieless.mspx