[置顶] 用户与服务器的交互:cookie简介

cookie允许站点对用户进行跟踪。

如图所示,cookie技术有4个组件:

(1)在HTTP响应报文中的一个cookie首部行

(2)在HTTP请求报文中的一个Cookie首部行

(3)在用户端系统中保留有一个Cookie文件,并由用户的浏览器进行管理;

(4)位于web站点的一个后端数据库

通过一个例子,来了解一下cookie:

假设susan家总是从家中PC使用IE上网,她首次与Amazon.com联系,假定她已经访问过eBay站点,当请求报文到达该Amazon Web服务器时,该web站点将产生一个唯一识别码,并以此作为索引在它的后端数据库中产生一个表项。接下来Amazon Web服务器用一个包含Set-cookie:首部的HTTP响应报文对susan的浏览器进行响应,其中set-Cookie:首部含有该识别码。例如,该首部行可能是:set-cookie:1678.

当Susan的浏览器收到了该HTTP响应报文时,它会看到该set-cookie:首部。该浏览器在它管理的特定cookie文件中添加一行,该行包含服务器的主机名和在set-cookie:首部中的识别码。值得注意的是该cookie文件已经有了用于eBay的表项,因为Susan过去访问过该站点。当Susan继续浏览Amazon网站时,每请求一个web页面,其浏览器就会从该cookie文件中获取她对这个网站的识别码,并放到HTTP请求报文中包括识别码的cookie首部行中。特别是,发往该Amazon服务器的每个HTTP请求报文都包括以下首部行:

Cookie:1678

在这种方式下,Amazon服务器可以跟踪Susan在Amazon站点的活动,它虽然不知道Susan的名字,但是它确切的知道用户1678按照什么顺序、在什么时间、访问了哪些页面。Amazon使用coo来提供它的购物车服务,即Amazon能够维护Susan希望购买的物品列表,这样在Susan结束会话时可以一起为它们付费。

如果Susan再次访问Amazon站点,比如一个星期后,她的浏览器会在其请求报文中继续放入首部行cookie:1678.Amazon将根据Susan过去在Amazon访问的网页向她推荐产品。如果Susan在Amazon注册过,即提供了她的全名、电子邮件地址、邮政地址和信用卡账号,则Amazon能在其数据库中包括这些信息,将她的全名与识别码相关联。这就解释了电子商务网站实现点击购物的道理。

从上述例子中,可以看到cookie可以用于标识一个用户。用户首次访问一个站点时,可能需要提供一个用户标识,在后继会话中,浏览器向服务器传递一个cookie首部,从而向该服务器标识了用户,因此cookie可以在无状态的HTTP上建立一个用户会话层。例如,当用户向一个基于web的电子邮件系统注册时,浏览器向服务器发送cookie消息,允许该服务器在用户与应用程序会话的过程中标识该用户。

[置顶] 用户与服务器的交互:cookie简介_第1张图片

cookie由变量名和值组成,类似js变量。其属性里既有标准的Cookie变量,也有用户自己创建的变量。属性中变量是用“变量=值”形式来保存。

Cookie格式如下:

set-Cookie:NAME = VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE

NAME= VALUE。这是每一个Cookie都必须有的部分。NAME是该Cookie的名称,VALUE是该Cookie的值。在字符串“NAME= VALUE”中,不含分号、逗号和空格等字符

Expires=DATE。Expires变量是一个只写变量,它确定了Cookie有效终止日期。该属性值DATE必须以特定的格式来书写:星期几,DD-MM-YY HH:MM:SS GMT。反之,系统无法识别。该变量可省,如果缺省时,则Cookie的属性值不会保存在用户的硬盘中,而仅仅保存在内存中,Cookie文件将随着浏览器的关闭而自动消失。

Domain=DOMAIN_NAME。Domain该变量是一个只写变量,它确定了哪些Internet域中的web服务器可读取浏览器所存取的Cookie,即只有来自这个域的页面才可以使用Cookie中的信息。这项设置是可选的,如果缺省时,设置Cookie的属性值为该web服务器的域名。

Path=PATH。Path属性定义了web服务器上哪些路径下的页面可获取服务器设置的Cookie。一般如果用户输入的URL中的路径部分从第一个字符开始包含Path属性所定义的字符串,该浏览器就认为通过检查。如果Path属性的值为“/”,则web服务器上所有的www资源均可读取该Cookie。同样该设置是可选的,如果缺省时,则Path的属性值为web服务器传给浏览器的资源的路径名。

借助对Domain和Path两个变量的设置,即可有效的控制Cookie文件被访问的范围。

SECURE:在Cookie中标记该变量,表明只有当浏览器和web server之间的通信协议为加密认证协议时,浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即HTTPS。

Cookies以键值的方式记录会话跟踪的内容.服务器利用响应报头Set-Cookie来发送COOKIE信息.在RFC2109中定义的SET-COOKIE响应报头的格式为:
Set-Cookie: Name = Value; Comment = value; Domain = value; Max-Age = value; Path = Value;
Secure; Version = 1 * DIGIT;

Name是Cookie的名字,Value是它的值.Name=Value属性值对必须首先出现,在此之后的属性-值对可以以任何顺序出现. 在Servlet规范中,用于会话跟踪的cookie的名字必须是JSESSIONID,Comment属性是可选的,因为Cookie可能包含其它有关用户私有的信息.这个属性允许服务器说明这个Cookie的使用,用户可以检查这个消息,然话决定是否加入或继续会话.Domain属性也是可选的.它用来指定Cookie在哪一个域中有效.所指定的域必须以点号(.)来开始.Max-Age属性是可选的,用于定义Cookie的生存时间,以秒为单位.如果超过了这个时间,客户端就应该丢弃这个cookie.如果指定的秒数为0,表示这个cookie应立即被丢弃.Path属性是可选的,用于指定这个cookie在哪一个URL子集下有效.Secure属性是必需的,它的值是一个十进制数,标识cookie依照的状态管理规范的版本.例如:
set-cookie: uid = zhangsan; Max-Age=3600; Domain=.sun.org; Path=/bbs; Version=1
它表示一个名为uid,值为zhangsan的cookie.生存时间为3600秒,在sunxin.org域的 bbs路径下有效.在3600秒后,客户端将抛弃这个cookie. 当IE收到上面这个响应报头后,可以选择接受或拒绝这个cookie.如果ID接受了这个cookie,当浏览器下一次发送请求到http://www.sunxin.org/bbs路径下的资源时,同时也会发送以下的请求报头:
cookie:uid=zhangsan.

你可能感兴趣的:(服务器,cookie)