转自:http://blog.csdn.net/zyw_anquan/article/details/7642004
当在用户在浏览器地址栏中键入了一个Web站点的URL时,浏览器会向该Web站点发送一个读取网页的请求,并将结果在用户显示器上显示。这时该网页在用户计算机上寻找对应这个网站设置的Cookie文件,如果找到,浏览器会把Cookie文件中的数据连同前面输入的URL一同发送到该网站服务器。服务器收到Cookie数据,就会在它的数据库中检索客户端的ID、购物记录、个人喜好等信息,并记录下新的内容,增加到数据库和Cookie文件中。如果没有检索到Cookie或Cookie信息与数据库中的信息不符合,则说明客户端是第一次浏览该网站,服务器的CGI(Common GatewayInterface,公共网关接口)程序将为客户端创建新的ID信息,并保存到数据库中。下面给出Cookie的读写流程:
(1)浏览器对于Web服务器应答包头中Cookie的操作步骤:
A.从Web服务器的应答包头中提取所有的cookie。
B.解析这些cookie的组成部分(名称,值,路径等等)。
C.判定主机是否允许设置这些cookie。允许的话,则把这些cookie存储在本地。
(2)浏览器对Web服务器请求包头中所有的cookie进行筛选的步骤:
A.根据请求的url和本地存储cookie的属性,判断那些cookie能被发送给Web服务器。
B.对于多个cookie,判定发送的顺序。
C.把需要发送的cookie加入到请求http包头中一起发送。
通过以上Cookie的读写流程,我们发现Cookie是利用了网页代码中的HTTP头信息进行传递的,但是Cookie 是与Web站点而不是与具体页面关联的,所以无论用户请求浏览某个站点中的哪个页面,浏览器和服务器都将交换该站点中的Cookie信息,浏览器的每一次网页请求,都可伴随Cookie传递。例如:浏览器的打开或刷新网页操作,服务器将Cookie添加到网页的HTTP头信息中,伴随网页数据传回到客户端的浏览器,浏览器根据客户计算机中的Cookie设置来选择是否保存这些数据。如果浏览器不允许保存Cookie,则关掉浏览器后,这些数据就消失。用户访问其他站点时,每个站点都可能会向用户浏览器发送一个 Cookie,而浏览器也会对所有这些 Cookie 做出相应的处理。
具体工作过程描述如下:
(1)Web客户端通过浏览器向Web服务器发送连接请求,通过HTTP报文请求行中的URL打开某一Web页面。
(2)Web服务器接收到请求后,根据用户端提供的信息产生一个Set-Cookies Header。
(3)将生成的Set-Cookies Header通过Response Header存放在HTTP报文中回传给Web客户端,建立一次会话连接。
(4)Web客户端收到HTTP应答报文后,如果要继续已建立的这次会话,则将Cookies的内容从HTTP报文中取出,形成一个Cookies文本文件储存在客户端计算机的硬盘中或保存在客户端计算机的内存中。
(5)当Web客户端再次向Web服务器发送连接请求时,Web浏览器首先根据要访问站点的URL在本地计算机上寻找对应的Cookies文本文件或在本地计算机的内存中寻找对应的Cookies内容。如果找到,则将此Cookies内容存放在HTTP请求报文中发给Web服务器。
(6)Web服务器接收到包含Cookies内容的HTTP请求后,检索其Cookies中与用户有关的信息,并根据检索结果生成一个客户端所请求的页面应答传递给客户端。
此外,Cookie在客户端计算机上保存的时间是不一样的,这些都是由服务器的设置不同决定的,Cookie中有一个Expires(有效期)属性,这个属性决定了Cookie的保存时间,也可以重新设定来改变它,若不设置该属性,那么Cookie只在浏览网页期间有效,关闭浏览器后,这些Cookie会自动消失。绝大多数网站属于这种情况。通常情况下,Cookie包含Server、Expires、Name、value这几个字段,其中对服务器有用的只是Name和value字段,Expires等字段的内容仅仅是为了告诉浏览器如何处理这些Cookies。
我们知道HTTP协议是一种无状态的协议,及客户端和服务器端不需要建立持久的链接。客户端和服务器的链接是基于一种请求应答模式。及客户端和服务器建立一个链接,客户端提交一个请求,服务器端收到请求后返回一个响应,然后二者就断开链接。即HTTP协议采用请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。下图表明了这种请求/响应模型。
HTTP请求/响应模型
了解了HTTP的工作过程后我们需要再了解HTTP请求报文和响应报文的格式。一个HTTP请求报文一般包括请求行、首部和实体(有时包含)3部分,下图给出了请求报文的一般格式,
请求报文
一个HTTP响应报文一般包括状态行、首部和实体(有时包含)3部分,其报文格式如图所示。在响应报文中,状态行定义了响应报文的状态,并由响应状态码和响应状态码说明字段反应。
响应报文
这里我们用一个比较熟悉的例子来理解HTTP的无状态性,如一个多图片网页的浏览。步骤为:①建立连接,客户端发送一个网页请求,服务器端返回一个html页面(这里的页面只是一个纯文本的页面,也就是我们写的html代码),关闭连接;②浏览器解析html文件,遇到图片标记得到url这时,客户端和服务器再建立连接,客户端发送一个图片请求,服务器返回图片应答,关闭连接。(这里又涉及到无状态定义:对于服务器来说,这次的请求虽然是同一个客户端的请求但是服务器还是不知道这个是之前的哪个客户端的,及对于事务处理没有记忆能力)。
但是需注意的是,服务器的响应次序必须是和客户端请求次序相同的。而无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。客户端与服务器进行动态交互的Web应用程序出现之后,HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。
我会在下文介绍Cookie与Session。