Chinaunix首页 | 论坛 | 博客
  • 博客访问: 333301
  • 博文数量: 46
  • 博客积分: 1921
  • 博客等级: 上尉
  • 技术积分: 417
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-03 17:07
文章分类

全部博文(46)

文章存档

2011年(19)

2010年(4)

2009年(11)

2008年(12)

我的朋友

分类: 系统运维

2011-02-11 16:40:26

HTTP是无状态链接,请求-回应完毕后客户端和服务器之间的链接就会断开。那么服务器是如何记住用户的,例如网上购物车,每次新添加购物项,上次添加的购物项还能存在,这是如何实现的?可以推测应该是客户端或服务器端将购物的信息记录下来,创建一个新的链接时候读取记录下来的数据,这样就实现无状态的HTTP连接提供有状态的连接的效果。

服务器端:

 在网络服务器看来,所有的HTTP请求都独立于之前的请求,也就是说他只识别你这次请求头中包含的信息,然后做出对应的响应。状态管理机制克服了HTTP的一些限制并允许网络客户端和服务器端维护请求间的关系,这种关系维持的期间叫做Session(会话)。Session是服务器端的一种保存上下文信息的机制,它是针对每一个用户的,session的值保存在服务器端。当服务器端程序需要为客户端请求创建一个session的时候,会首先检查请求中是否包含了一个session标识—sessionID,如果包含sessionID,说明以前就已经为该用户创建过session,服务器会直接按照这个sessionID将对应的session检索出来使用(没有检索到可能会新建一个);如果客户端请求没有包含sessionID,则为这个用户新建一个session并生成一个相关联的sessionID(sessionID的值应该是一个不会重复,也不容易找到规律的字符串),这个sessionID将在本次响应中返回给客户端保存。

购物车例子:

当你买第一个物品的时候点击“购买”,浏览器将请求发送到服务器(该请求中没有sessionID,因为这是你要买的第一个物品,之前没有和服务器交互),服务器发现没有sessionID,就会为客户端创建一个session和与之相关联的sessionID,并把刚创建的这个sessionID在本次响应中返回给客户端,客户端的浏览器接收到返回的响应把这个sessionID存储,当你再次向购物车添加物品时候,浏览器会在后台自动将你存储的sessionID发送给服务器,服务器按照这个sessionID检索到对应的session,然后进行处理返回给你页面,这样你才能够看到上次添加的购物项。

客户端:

 在客户端用来存储服务器返回的sessionID和其他一些信息的称为cookie。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie,在交互的时候浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。可以使用HEAD命令得到服务器的响应头,有的网站响应头中包含set-cookie项(例如hi.baidu.com),该项中包含一个名值对,过期时间,路径和域,这些都是由服务器指定。路径就是跟在域后面的url路径,路径和域组成了cookie的作用范围的大小;设置过期时间,就会将cookie保存到硬盘上,关闭浏览器再打开,cookie依然有效,直到请求的时间超过了指定的时间。如果不设置过期时间,则cookie一般不存储在硬盘上而是保存在浏览器的内存里,当然这种行为并不是规范规定的。所以cookie有两种,一种是存储到本地的文本文件之中的,叫做persistent (持久化的)cookie;另一种是并不存储在本地硬盘之中,而是放在浏览器的内存里面,我叫做session cookie。Persistent cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于session cookie,不同的浏览器有不同的处理方式,有的浏览器可以跨窗口使用比如Firefox,有的不能比如IE但是IE允许一个窗口生成的窗口(子窗口)共享session cookie。

推测:如果客户端禁用cookie,那么将无法向购物车中添加物品。

 禁用IE的cookie,访问当当网,选中一本书,点击购买,发现返回的页面为空白页面,并没有我购买的书;允许使用cookie,购买返回的页面中购买的书已被添加到购物车之中。说明推测是正确的。可是如果禁用浏览器的cookie就无法访问需要创建session的服务器了吗?由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id 直接附加在URL路径的后面,这样服务器就可以解析url地址后面的sessionID进行处理。发送SessionID有两种方式,一种就是将sessionID存放在cookie里面浏览器自动发送;另一种是当客户端禁用cookie时,通过URL重写将sessionID发送给服务器。

Session的生命周期:

 Session什么时候会被服务器删除,有人可能会认为当客户端的浏览器窗口关闭时候session就会被删除,其实不然。事实上除非程序通知服务器删除一个session,否则服务器会一直保留。浏览器关闭之前不会通知服务器,所以服务器不会知道浏览器什么时候关闭,之所以有“浏览器关闭,session就消失”这样的感觉,是因为大多数的session机制都是用会话 cookie(session cookie)来保存sessionID,这样浏览器关闭之后sessionID就消失了,再次连接服务器时候,分配了新的sessionID,也就不能找到以前那个session了,但是如果用persistent cookie来保存sessionID的话,再打开新的浏览器也能够找到那个sessionID加到请求之中,服务器就能够找到那个session。由于浏览器的关闭或者浏览器的进程被强行杀死或者断网,服务器都无法知道,所以服务器设置了一个失效时间,只要距离客户端上次访问的时间超过了失效时间,则认为客户端活动停止了,此时删除session节省存储空间。

 例子:登录电子邮箱,长时间(超过失效时间)没有操作,再对邮箱操作的话页面刷新之后提示你页面已经过期,此时session已经被删除。

总结:HTTP是无状态链接,因为要实现有状态链接的效果,所以采用session和cookie两种机制。客户端请求需要包含服务器指定的唯一的sessionID,如果请求中没有sessionID,服务器将为该请求创建一个session和与之相关联的sessionID并把这个sessionID放入响应之中,并加上一行特殊的指示以提示浏览器按照指示生成相应的cookie,将响应返回给客户端,客户端的浏览器按照规则解析响应,如果浏览器支持cookie则将sessionID和其他信息存储起来(persistent cookie 或者session cookie),下次再次访问同一服务器时候浏览器将对应的cookie和请求头一起发送给服务器,服务器按照sessionID进行检索找到对应的session进行处理。

阅读(1636) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~