在网上最近看到一篇不错的有关Session和cookie讲解的知识现在总结一下自己的理解。


一、Session工作原理:

    1.中文经常被翻译为会话,其实指的是有始有终的一系列动作/消息,比如:打电话从拿起电话拨号到挂断电话这中间的一系列过程可称为一个Session。

    2.浏览器会话期间是指浏览器窗口打开到关闭的这个期间。

    3.Session与网络协议相关联时,隐含了“面向联接”和“保持状态”两个概念,其中面向联接:是指通信双方在通信之前要建立一个通信的渠道,如:电话通信【当你拿起电话拨号,接通电话表示通信建立成功,对方未接通表通信未建立,但这都可称为通信】。保持状态:通信一方能够把一系列的消息关联起来,使得消息之间可以互相依赖。

    4.在Web服务器时代,Session是一类用来在客户端和服务器间保持状态的解决方案。

    5.HTTP协议与状态保持:我们知道HTTP协议是无状态,每次客户端各服务器发出的请求间都是独立的。cookie的作用就是为了解决HTTP协议无状态缺陷所作出的努力,至于后来的Session机制则是又一种在客户端与服务器之间保持状态的解决方案。

    6.cookie与session之间区别与联系:(笔者、咖啡厅、优惠:喝5杯送1杯、信息记录)1.该店员很厉害,顾客一进店就能想来、记住顾客的消费信息,这种做法叫做协议支持状态。2.必给顾客一张卡片,上面记着消费明细,每次消费需要出出示卡片,信息才能被关联起来,这种做法叫做客户端保持状态。3.发给顾客一张会员卡,除了卡号之外,什么信息也不记录,每次消费时,只要顾客出示卡,则店员就能在店里的记录本上找到这个卡号对应的消费信息,这种做法就是服务器保持状态。

    具体来说,Cookie机制是采用客户端保持状态的方案,而Session机制是采用在服务器端保持状态的方案,同时我们也看到由于服务器保持状态的方案在客户端也需要保存一个标识,所以session机制,可能需要借助于cookie来达到保存标识的目的,但实际上它还有其它的选择。

    7.理解cookie机制:“会员卡”何时发出;“会员卡”的内容;3.客户如何使用“会员卡”。正统的cookie是分发是通过扩展的HTTP协议来实现的,服务器端通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie,然而纯粹的脚本如JavaScript、VBScript也可以生成cookie。而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的,浏览器会检查所有的的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的头上发送给服务器,意思是麦当劳的会员卡,只能在麦当劳店使用,若其中分店发行自己的会员卡,那么进这家店的时候还需要出示这家店的会员卡。cookie的内容包括:名字、值、过期时间、路径、域,其中可以指定某个域,如.google.com也可以指定域下的某台机器,如mobile.google.com,路径是跟在域后面的URL路径,如/feedback,路径与域合在一起就构成了cookie的的作用范围。如果不设置过期时间,则表示这个cookie的生命周期为浏览器会话期间的cookie,一般不存在硬盘上而是保存在内存中。如果设置了过期时间,浏览器会把cookie保存在硬盘中,善后浏览器后再次打开浏览器这些浏览器仍然有效,直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如:两个IE窗口,而对于保存在内存中的cookie不同的浏览器有不同的处理方式。对于 IE,在一个打开的窗口上接ctrl+N或通过菜单文件--新建,打开的窗口与原窗口共享,而使用其它方式新打开的IE进程,则不能共享巳打开的窗口的内在的cookie,对于Mozilla,所有进程和标签都可共享同样的cookie,一般来说,用Javascript的window.open打开的窗口会与原窗口共享内存cookie,浏览器对于会话cookie这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发才造成很大的困扰。

    8.理解Session机制:它是种服务器端的机制,服务器使用一种类似于散列表(也可以有就是散列表)来保存信息,当程序需要为某个客户端请求创建一个session的时候,服务器首选检查客户端的请求里是否己包含了一个session id标识,如果存在将一起发送,不存在,将被创建。保存session id的方式有以下几种:1.cookie实现。2.经常被使用的一项技术,即URL重写:就是把session id直接附加在URL路径后后面,附加方式也有2种,其一是作为URL路径的附加信息如:http://www.google.com/abc;jsessionid=fadfasasfasfasasfs;其二作为查询字符串附加信息如:http://www.google.com/abc?jsessionid=fasdfasfasfsafasa;这两种方式对用户来说是没区别的,只是服务器解析的时候处理的方式不同,采用第一种方式利于把session id的信息与正常程序的参数区分开来,为了在整个交互过程中始终保持状态,就必须在每个客户端请求后面都包含这个session id。另一种技术叫做表单隐藏字段,就是服务器自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。如<form name="testform" action="/……"><input type="text" /></form>  在传递至客户端之前被修改为:<form name="testform" action="/……"><input type="hidden" value=""/> <input type="text" /></form>

     9.session:持久性保存在硬盘中。