漫谈Cookie与Session 及其区别和联系

之前在网上看到了有人关于Session详解,感觉不错,的确很多人对Cookie与Session一直处于混淆状态,因此,我在这里借用了一部分前辈的总结,经过自己的理解进行修改和完善,并补充了二者之间的区别和联系,如有不妥当之处还请各位批评指正。

一、Session概念

Session,中文翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个会话。在这里Session是指一个浏览器从打开访问一个WEB站点到关闭对这一WEB站点的访问的全过程

二、HTTP协议与状态保持

HTTP 协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的

Cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的Session机制则是又一种在客户端与服务器之间保持状态的解决方案。

让我们用几个例子来描述一下Cookie和Session机制之间的区别与联系。

比如一家咖啡店有优惠活动:喝5杯咖啡免费赠一杯咖啡,然而顾客一般不可能一次性消费5杯咖啡,这时就需要某种方式来纪录某位顾客的消费数量。因此有下面的几种方案:1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。

2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客

户端保持状态,即Cookie机制

3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就

是在服务器端保持状态,即Session机制

由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说Cookie机制采用的是在客户端保持状态的方案,而Session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以Session机制可能需要借助于Cookie机制来达到保存标识的目的,但实际上它还有其他选择。

三、理解Cookie机制 

Cookie机制的基本原理就如上面的例子一样,但是还有几个问题需要解决:“会员卡”如何分发;“会员卡”的内容;以及客户如何使用“会员卡”。

Cookie分发机制:

正统的Cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的Cookie。并存储在Internet临时文件里,然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成Cookie。而Cookie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的Cookie,如果某个Cookie所声明的作用范围(是由Cookie中的路径与域合组成)大于等于将要请求的资源所在的位置(例如资源所在的位置为www.google.com/foo而Cookie中的范围可能是www.google.com/即大于或者www.google.com/foo即等于),则把该Cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。

Cookie内容:

Cookie的内容主要包括:名字,值,过期时间,路径和域。

1.域:可以指定某一个域比如.google.com,也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.com

2.路径:就是跟在域名后面的URL路径,比如/或者/foo等等。

路径与域合在一起就构成了Cookie的作用范围。

如果不设置过期时间,则表示这个Cookie的生命期为浏览器会话期间,因为它只是保存在客户端内存中,只要关闭浏览器窗口,Cookie就消失了。这种生命期为浏览器会话期的Cookie被称为会话Cookie。会话Cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把Cookie保存到硬盘上,关闭后再次打开浏览器,这些Cookie仍然有效直到超过设定的过期时间。存储在硬盘上的Cookie 可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的Cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按 Ctrl+N(或者从文件菜单)或者其他IE内核的浏览器(如360或搜狗)打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存Cookie;对于 Mozilla Firefox8.0,所有的进程和标签页都可以共享同样的Cookie。

一般来说是用JavaScriptwindow.open打开的窗口会与原窗口共享内存Cookie。浏览器对于会话Cookie的这种只认Cookie不认人的处理方式,经常给采用Session机制的web应用程序开发者造成很大的困扰。

下面就是一个Goolge设置Cookie的响应头的例子

HTTP/1.1 302 Found

Location: http://www.google.com/intl/zh-CN/

Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com

Content-Type: text/html

当浏览器再次访问Goolge的资源时自动向外发送Cookie

四、理解Session机制

Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构来保存信息。

当程序需要为某个客户端的请求创建一个Session的时候,服务器首先检查这个客户端的请求里是否已包含了一个Session标识,称为Session id,如果已包含一个Session id则说明以前已经为此客户端创建过Session,服务器就按照Session id把这个 Session检索出来使用(如果检索不到,可能会在服务器内存中新建一个Session),如果客户端请求不包含Session id,则为此客户端创建一个Session并且生成一个与此Session相关联的Session idSession id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个Session id会在本次服务器响应中被返回给客户端保存。保存这个Session id的方式一般是在客户端浏览器创建一个Cookie,将Session id保存在该Cookie,这样在交互过程中浏览器可以自动的按照规把这个标识发给服务器端。

一般这个Cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的Cookie,JSessionID= ByOK3vjFD75aPnrF7C2HmdnV6nLerjQ99zWpBng!-145788764,它的名字就是 JSessionID

由于Cookie可以被人为的禁止,必须有其他机制以便在Cookie被禁止时仍然能够把Session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把Session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx;jSessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcYzWpBng!-145788764,

另一种是作为查询字符串(queryString的方式)附加在URL后面,表现形式为http://...../xxx?jSessionid=ByOK3vjFD75aPnrF7C2HiBYEnLerjQ99zWpBng!-145788764这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把Session id的信息和正常程序参数区分开来。

为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个Session id

另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把Session id传递回服务器。

这种技术现在已较少应用,实际上这种技术可以简单的用对action应用URL重写来代替。

在谈论Session机制的时候,常常听到这样一种误解“只要关闭浏览器,Session就消失了”。这种说法并不正确,对Session来说,除非程序通知服务器删除一个Session,否则服务器会把Session一直保留在内存当中,程序一般都是在用户做log off的时候发个指令去删除Session,例如一般在网上银行上都会有安全退出,然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分Session机制都使用会话Cookie来保存Session id,而由于关闭浏览器后该会话Cookie就从内存中删除了,因此这个会话的Session id也就消失了,再次连接服务器时也就无法找到原来的Session。如果服务器设置的Cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的Session id发送给服务器,则再次打开浏览器仍然能够找到原来的Session。

恰恰是由于关闭浏览器不会导致Session被删除,迫使服务器为Session设置了一个失效时间,默认一般是30分钟,当距离客户端,上一次使用Session的时间超过这个失效时间时,即两次使用Session的时间间隔超过这个失效时间时,服务器就可以认为客户端已经停止了活动,服务器端才会把Session从内存中删除以节省存储空间。

五、

CookieSession的区别和联系


区别

Cookie

Session

存储位置

客户端

服务器端

共享性

可以被多个浏览器所共享

仅由一个浏览器所独享

存储形式

会话Cookie则存储在客户端内存当中

若设置Cookie过期时间则存储在客户端浏览器的Internet临时文件中,并保存在硬盘中

仅存储在服务器端的内存中

存储内容及类型

Cookie仅存储指定的内容(名字 值 过期时间 路径 域) 且仅是字符串类型

Session可以存储任意内容,类型不限,可以是类的对象以及集合

是否支持非英文

不直接支持非英文,必须进行编码和解码处理

直接支持非英文

加密

可以加密

不必加密

生命周期时间单位

生命周期修改方式

在WEB应用程序中修改,如setMaxAge()方法

在服务器软件的配置文件中改,默认是30分钟,修改整个站点的Session生命周期

在项目的WEB应用程序中改,仅修改该WEB应用程序的Session生命周期

在程序中修改,仅修改该指定的Session生命周期

三种方式优先级依次升高

生命周期计时方法

会话Cookie是从该Cookie被建立到浏览器关闭

设置过期时间的Cookie是指从该Cookie被建立开始,时间累计到生命周期后该Cookie失效

是指客户端两次使用Session的时间间隔,若时间间隔超过生命周期时,该Session才失效,否则,该Session一直有效,默认生命周期是30分钟

CookieSession的联系

一般情况下SessionSession id是以会话Cookie的方式存储在客户端内存中的,当关闭浏览器时,会删除该会话Cookie,因此,关闭浏览器后就无法找到原来存储该Session id的会话Cookie,因此,无法找到原来的Session ,但是此时原来的Session 还存储在服务器端的内存当中,知道到达生命周期后才会从服务器端的内存中删除。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值