【读书笔记】Web前端开发必须了解的Cookie
定义:Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。
作用:
1. 目前Cookies 最广泛的是记录用户登录信息,这样下次访问时可以不需要输入自己的用户名、密码了。
2. 网站可以利用cookies跟踪统计用户访问该网站的习惯,比如什么时间访问,访问了哪些页面,在每个网页的停留时间等。利用这些信息,一方面是可以为用户提供个性化的服务,另一方面,也可以作为了解所有用户行为的工具,对于网站经营策略的改进有一定参考价值。例如,你在某家航空公司站点查阅航班时刻表,该网站可能就创建了包含你旅行计划的Cookies,也可能它只记录了你在该站点上曾经访问过的Web页,在你下次访问时,网站根据你的情况对显示的内容进行调整,将你所感兴趣的内容放在前列。这是高级的Cookie应用。
另外,有人认为网站利用cookies可能存在侵犯用户隐私的问题,但由于大多用户对此了解不多,而且这种对用户个人信息的利用多数作为统计数据之用,不一定造成用户的直接损失,因此现在对于cookies与用户隐私权的问题并没有相关法律约束,很多网站仍然在利用cookie跟踪用户行为,有些程序要求用户必须开启cookie才能正常应用。IE浏览器用户可以通过"隐私"选项中的隐私设置的高低来决定是否允许网站利用cookie跟踪自己的信息,从全部限制到全部允许,或者限制部分网站,也可以通过手动方式对具体的网站设置允许或者禁止使用cookies进行编辑。IE浏览器的默认设置是 "中级"-对部分网站利用cookie有限制。个人电脑的cookies设置(对IE浏览器而言)可通过菜单"工具-Internet选项-隐私"来查看和修改。
Cookie的传递:
首先,Cookie是利用了网页代码中的HTTP头信息进行传递的,浏览器的每一次网页请求,都可以伴随Cookie传递。
需要说明的是,HTTP头信息又分为HTTP请求头和HTTP响应头——顾名思义,应该都不用解释。这些HTTP头信息包含许多键值对,全都是以"键:值"的形式来保存及传递的。对于Cookie来说,在服务器端进行读取Cookie时以"Cookie"为键由客户端发送到服务器端,也就是说,以"Cookie"为键发送HTTP请求头;而在服务器端我们进行处理后,如果对Cookie有改动,则将以"Set-Cookie"为键发送HTTP响应头由服务器端传送回客户端,比如新增加cookie,删除cookie(即将cookie中的属性expires设为当面当前时间)。
Cookie的属性:
1. expires(Cookie的失效期)
2. path(关联到cookie的路径,默认为/。默认情况下,cookie会和创建它的网页以及与这个网页处于同一个目录下的网页和处于该目录的子目录下的网页关联。例如,如果一个cookie由位于http://www.163.com/news/index.html的网页创建,那么它对位于http://www.163.com/news/order.html和位于http://www.163.com/news/validate/index.html的网页也是可见的,但是对于位于http://www.163.com/lottery/index.html的网页就不可见了。)
3. domain(设置关联cookie的域名。默认情况下,只有和设置cookie的网页来自同一web服务器的页面才能访问这个cookie。但是,大的网站可能需要由多个web服务器共享cookie。例如,位于talk.test.com的服务器就可能读取info.test.com设置的cookie值。这里就引入了第三个cookie属性domain。将定由位于talk.test.com的页面创建的cookie把自己的path属性设置成"/",把domain设置成了".test.com",那么所有位于info.test.com的页面和所有位于talk.test.com的页面以及所有位于test.com域的其他服务器上的网页都能够访问这个cookie。如果没有设置cookie的domain值,该属性的默认值就是创建cookie的网页所在的服务器的主机名。注意,不能将一个cookie的域设置成服务器所在的域之外的域。)
4. secure,values,value,name....
值得注意的是Cookie有个expires的属性,而HTTP头信息中也包含有expires这个属性。前者只是决定Cookie的失效期,而后者expires是键,用于控制请求文件的有效时间,当请求数据在有效期内时客户端浏览器从缓存请求数据而不是服务器端;当缓存中数据失效或过期,才决定从服务器更新数据。可以使用Apache的mod_expires模块来设置,可以控制应答时的Expires头内容和Cache-Control头的max-age指令,当设置了expires后,会自动输出Cache-Control的max-age信息,这个数值是expires有效期内的秒数。
以下为HTTP头信息实例:
引用1. HTTP 请求消息头部实例:
Host:rss.sina.com.cn
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14
Accept:text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language:zh-cn,zh;q=0.5
Accept-Encoding:gzip,deflate
Accept-Charset:gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive:300
Connection:keep-alive
Cookie= "7i24LINKGATE=12403433566263x1173026144x12403433879953; domain=sina.com; path=/ "; <-- Cookie
If-Modified-Since:Sun, 01 Jun 2008 12:05:30 GMT
Cache-Control:max-age=0
2. HTTP 响应消息头部实例:
Status:OK - 200 <-- 响应状态码,表示 web 服务器处理的结果。
Date:Sun, 01 Jun 2008 12:35:47 GMT
Server:Apache/2.0.61 (Unix)
Last-Modified:Sun, 01 Jun 2008 12:35:30 GMT
Accept-Ranges:bytes
Content-Length:18616
Cache-Control:max-age=120
Expires:Sun, 01 Jun 2008 12:37:47 GMT
Content-Type:application/xml
Age:2
X-Cache:HIT from 236-41.D07071951.sina.com.cn <-- 反向代理服务器使用的 HTTP 头部
Set-Cookie: 7i24LINKGATE=1251903217940x1173027775x1251949947438; domain=sina.com; path=/
Via:1.0 236-41.D07071951.sina.com.cn:80 (squid/2.6.STABLE13)
Connection:close
Cookie的操作及处理:
对于不同的技术来说,处理的方式及方法各不相同,比如在Javascript,PHP,JSP,Java,C#中处理。那只是每种语言定义的API不同而已,只要理解了要达到的目的,具体实现的方法可在各自关于Cookie的操作里查询。写到这里,怎么感觉编程真的就同"面向对象"密不可分了呢:只要达到目的,管你怎么实现的,呵呵。