4.3.3 HTTP的无状态性与cookie机制

4.3.3 HTTP的无状态性与cookie机制

上面讲述的HTTP协议是请求-响应模式,工作过程为:客户发送请求,建立连接,收到响应后,结束,断开连接。下一次请求相同的对象时,再次重复这种请求-响应模式。系统不记录两次连接的关联信息,称为无状态性。Web服务器并不保存关于客户机的任何信息。当同一个客户在短短的几秒钟内两次请求同一个页面时,服务器并不记得曾经为这个客户提供了服务,也不记得为该客户服务过多少次。HTTP的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求。

在Web设计之初,这种模式完全可以满足获取公开可用文档的需求。但随着Web应用的发展,站点需要提供越来越多新的特性,如为用户提供购物车功能、记录用户名密码以便用户自动登录、允许用户定制主页面外观、定向发送广告,等等。这些功能都要求Web站点能够识别用户、跟踪会话。

HTTP引入了一种机制,称为cookie机制,即一种利用cookie实体实现站点跟踪用户的技术。Cookie的实体是一个小的文件(或字符串),它由服务器产生,以文本形式记录了在Web服务器和客户之间传递的状态信息。Cookie文件保留在用户主机中,由浏览器管理。Cookie实体通常包含域名(Domain)、路径(Path)、内容(Content)、到期时间(Expires)、安全域(Secure)几个属性,其说明如表4-4所示。

表4-4 Cookie实体的属性及说明

Cookie机制的工作过程包括:①用户使用浏览器访问网站时,浏览器首先在cookie文件中查找该网站是否向其发过cookie。若有,则将cookie加入请求报文中,发送至服务器;②服务器接收请求后,查看首部行中是否包含cookie。若有,提取cookie进行处理;否则,根据用户信息创建cookie;③然后服务器向客户端返回响应时,将cookie加入响应报文;④客户端接收响应报文,提取cookie保存在相应的cookie文件中,待下次访问时随请求报文发送至服务器。

下面以网上购物为例,介绍cookie机制是如何工作的,如图4-6所示。

图4-6 Cookie机制的工作过程

Alice希望在网上书店Best Book(该网站使用cookie)购买图书。她在第一次访问网站时,浏览器向该网站的服务器发送请求,服务器为Alice生成一个唯一的识别码,如12345,并以此作为索引在服务器的后端数据库中产生一个表项记录Alice的购物数据。接着服务器返回响应报文,该报文除了包含提供给Alice的图书清单和相关链接外,还包含一个Set-cookie的首部行,即Set-cookie:12345,而后面的值就是赋予该用户的“识别码”,即12345。

当Alice收到响应时,其浏览器会显示图书的信息并在它管理的特定cookie文件中添加一行,其中包括这个服务器的主机名和Set-cookie后面给出的识别码。当Alice选中某个图书时,浏览器发送一个HTTP请求报文,报文的Cookie首部行包含了由cookie文件中取出的这个网站识别码12345,即Cookie:12345。

这样,网站在收到请求报文时检查首部行就能够找到12345对应的购物信息。当图书被放入用户的购物车后,服务器可以发送另一条响应报文,告诉Alice购物车内商品的总价并询问她支付方式。Alice提供她信用卡信息,并发送包含cookie的请求报文。服务器检查到12345这个识别码,接收订单并向用户返回响应报文进行订单确认。用户其他的信息如电子邮件地址、信用卡号码、收货地址都会保存在服务器上。

如果Alice在几天后再次访问BestBook(假设该cookie有效期为一个月),并且还使用同一台计算机上网,那么她的浏览器会在其HTTP请求报文中继续使用首部行Cookie:12345,服务器就可利用cookie来验证这是用户Alice,并根据她过去的访问记录向她推荐商品。Alice也不必在再次购物时重新输入姓名、信用卡号码等信息。

上述例子使用了cookie机制识别用户,除此之外,站点可以使用cookie记录用户的购物车内容和数量,实现购物车功能;也可以将用户喜欢的页面信息放入cookie记录用户的偏好,实现定制个性化页面;还可以用cookie记录哪些内容引起特定用户的兴趣,并向这些用户投放相关广告,实现定向广告,等等。通过让服务器读取之前发送给客户端的信息,站点即可实现识别用户、跟踪会话的功能,为用户提供诸多便利。

尽管cookie机制常常能简化用户的网上购物活动,它的使用仍然存在很大的争议。因为它很可能被用于侵犯用户的隐私。就像上面的例子,结合cookie和用户提供的账户信息,Web站点可以知道许多有关用户的信息,包括信用卡信息、电子邮件地址等,并可能将这些信息出卖给第三方。为了让用户能够拒绝接收cookie,用户可在浏览器中自行设置接收cookie的条件。