Cookie是指Web服务器可以在用户的硬盘上存储的一段文本。Cookie允许网站将信息存储在用户的计算机上,并在以后检索此信息。这些信息以名称/值对的形式存储。因为HTTP协议是无状态的,对于一个浏览器发出的多次请求,WEB服务器无法区分 是不是来源于同一个浏览器。所以,需要额外的数据用于维护会话。 Cookie 正是这样的一段随HTTP请求一起被传递的额外数据。 Cookie只是一段文本,所以它只能保存字符串。而且浏览器对它有大小限制以及 它会随着每次请求被发送到服务器,所以应该保证它不要太大。 Cookie的内容也是明文保存的,有些浏览器提供界面修改,所以, 不适合保存重要的或者涉及隐私的内容。大多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。
用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。 浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。通过前面的内容,我们了解到Cookie是用于维持服务端会话状态的,通常由服务端写入,在后续请求中,供服务端读取。
cookie传输过程详解
如果在浏览器中键入一个网站的URL,则浏览器会向该网站发送相关网页的请求。例如,如果在浏览器中键入URL http://www.169it.com,则浏览器将联系169it的服务器并请求其主页。当浏览器执行上述操作时,它会在您的计算机上寻找169it设置的Cookie文件。如果找到169it Cookie文件,浏览器就会将该文件中的所有名称/值对连同URL一起发送给169it的服务器。如果未找到任何Cookie文件,则不会发送任何Cookie数据。
169it的Web服务器将接收Cookie数据和页面请求。如果接收到名称/值对,169it就可以使用它们。如果未接收到任何名称/值对,169it将知道您之前从未访问过该网站。服务器将在169it的数据库中为您创建一个新ID,然后将名称/值对放置在它发送的网页的标头中,从而发送到您的计算机上。计算机将名称/值对存储在硬盘上。每当您访问网站并请求页面时,Web服务器可以更改名称/值对或添加新对。服务器还可以将其他一些信息连同名称/值对一起发送,这些信息中包括到期日期。另一个信息是路径(以便网站可以将不同的Cookie值与网站的不同部分相关联)。您可以控制整个过程。在浏览器中设置一个选项,以便每当网站向您发送名称/值对时,浏览器都会通知您。之后,您便可以接受或拒绝这些值。
网站是如何使用Cookie
网站可以按照许多不同的方式使用Cookie。以下是一些最常见的示例:
网站可以准确确定网站的实际访问人数。研究表明,由于存在代理服务器、缓存、集中器等,网站用来准确计算访问者数量的唯一方法就是为每个访问者设置一个包含唯一ID的Cookie。通过使用Cookie,网站可以确定:
访问者人数
新访问者和重复访问者的人数对比
访问者的访问频率
网站通过使用数据库来完成此任务。当访问者第一次访问网站时,网站会在数据库中创建一个新ID,并将此ID作为Cookie发送。当用户下一次返回网站时,网站会在数据库中将与此ID相关的计数器递增,从而知道访问者的返回次数。
网站可以存储用户首选项,以便使此网站的外观对于每一个访问者都可以是不同的(通常称作自定义)。例如,如果您访问msn.com,该网站会为您提供“更改内容/布局/颜色”的功能,还允许输入您所在地区的邮政编码来获取自定义的天气信息。
Cookie存在的问题
Cookie使许多原本不可能的事情变为了可能,但它还不是一种完善的状态机制。例如,Cookie在以下一些方面还不够完善。人们经常共享计算机——在公共场所使用的任何计算机以及在办公环境或家中使用的许多计算机都可以由多个人共享。假设您使用公共计算机(例如在图书馆中)从网上商店买东西,商店会在计算机上留下一个Cookie,这样便导致其他人稍后可能会试图使用您的帐户从商店买东西。商店之所以通常会发布有关此问题的大量警告,原因就在于此。然而即使如此,还是会有错误发生。 在恰当地使用了帐户的Windows NT计算机或UNIX计算机的系统上,则不会出现这类问题。帐户可以将所有用户的Cookie分开。然而帐户在其他操作系统上太过随意,这是个问题。
目前有以下几种Cookie规范
•Netscape cookie草案:是最早的cookie规范,基于rfc2109。尽管这个规范与rc2109有较大的差别,但是很多服务器都与之兼容。
•rfc2109, 是w3c发布的第一个官方cookie规范。理论上讲,所有的服务器在处理cookie(版本1)时,都要遵循此规范。遗憾的是,这个规范太严格了,以致很多服务器不正确的实施了该规范或仍在使用Netscape规范。
•rfc2965规范定义了cookie版本2,并说明了cookie版本1的不足。
rfc2965规范的使用,目前并不多。rfc2109规范相应要严格得多,在实际应用上,并不是所有的浏览器和Web服务器都严格遵守。因此相比较而言,Netscape cookie草案倒是一个比较简洁和被广泛支持的Cookie规范,因此我们在这里以Netscape cookie草案为基础进行讨论,对于其他两种规范,我们的讨论和代码具有相同的意义。关于Netscape cookie草案的细节,大家可以参照Netscape官方站点,这里我们列举一些和我们讨论有关的内容。
根据Netscape cookie草案的描述,Cookie 是Web 服务器向用户的浏览器发送的一段ASCII码文本。一旦收到Cookie,浏览器会把Cookie的信息片断以"名/值"对(name-value pairs)的形式储存保存在本地。这以后,每当向同一个web 服务器请求一个新的文档时,web 浏览器都会发送之站点以前存储在本地的Cookie。创建Cookie的最初目的是想让Web服务器能够通过多个HTTP请求追踪客户。有些复杂的网络应用需要在不同的网页之间保持一致,它们需要这种会话状态的保持能力。
浏览器与Web服务器通过HTTP协议进行通讯,而Cookie就是保存在HTTP协议的请求或者应答头部(在HTTP协议中,数据包括两部分,一部分是头部,由一些名值对构成,用来描述要被传输数据的一些信息。一部分是主体(body),是真正的数据(如HTML页面等))进行传送的。