cookie 、session

来源:互联网 发布:程序员出差携带 编辑:程序博客网 时间:2024/06/18 02:45

引例:

找到这么个例子来描述cookie session的关系再恰当不过了
一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。下面的几种方案:

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


(2)发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。

第一种情况卡片无疑就是cookie了,所有的数据如果都存在卡片上是不安全的,也是容易遗失的(卡片被修改了?卡片遗失了?这都是有可能的).
所以才用了第二种情况.客户除了个会员号再什么信息也没有,这是最安全的,但这个会员号必须是客户自己知道的!也就是cookie中必须存储的


机制:

(1)cookie机制采用的是在客户端保持状态的方案。
它是在用客户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持。cookie的作用就是为了解决http协议无状态的缺陷所作的努力.

由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做url重写,就是把session id直接附加在url路径的后面。

cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。
会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。

(2)session机制采用的是一种在客户端与服务器之间保持状态的解决方案。
由于采用服务器端保持状态的方案在客户端也需要保存一个标识, 所以session机制可能需要借助于cookie机制来达到保存标识的目的。而session提供了方便管理全局变量的方式。
session是针对每一个用户的,变量的值保存在服务器上,用一个sessionid来区分是哪个用户。

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构来保存信息。
当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来,如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。一般这个cookie的名字都是类似于seeesionid。

在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log out的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏 览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写 浏览器发出的http请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。
恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息, 那么要怎么才能实现网上商店中的购物车呢?
session就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过 sessionid来区分不同的客户当我们把浏览器的cookie禁止后,其他web服务器 会采用url重写的方式传递sessionid,我们就可以在地址栏看到 sessionid=kwjhug6jjm65hs2k6之类的字符串。

区别:

cookie与session的区别是:
cookie数据保存在客户端,session数据保存在服务器端。

如果其他web服务器端使用的是session,那么所有的数据都保存在服务器上面,客户端每次请求服务器的时候会发送当前会话的 sessionid,服务器根据当前sessionid判断相应的用户数据标志,以确定用户是否登录,或具有某种权限。由于数据是存储在服务器上面,所以你不能伪造。

如果浏览器使用的是 cookie,那么所有的数据都保存在浏览器端,比如你登录以后,服务器设置了 cookie用户名(username),那么,当你再次请求 服务器的时候,浏览器会将username一块发送给服务器,这些变量有一定的特殊标记。服务器会解释为 cookie变量。所以只要不关闭浏览器,那 么 cookie变量便一直是有效的,所以能够保证长时间不掉线。

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
考虑到安全应当使用session
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用cookie
4、单个cookie在客户端的限制是3k,就是说一个站点在客户端存放的cookie不能3k。
5、所以个人建议:
将登陆信息等重要信息存放为session
其他信息如果需要保留,可以放在cookie中

session的工作方式(比喻):

假设 web server是一个商场的存包处,http request是一个顾客,第一次来到存包处,管理员把顾客的物品存放在某一个柜子(session),然后把一个号码牌交给这个顾客,作为取包凭证(这个号码牌就是session id)。顾客(http request)下一次来的时候,就要把号码牌(session id)交给存包处(web server)的管理员。管理员根据号码牌(session id)找到相应的柜子 (session),根据顾客(http request)的请求,web server可以取出、更换、添加柜子(session)中的物品,web server也可以让顾客(http request)的号码牌和号码牌对应的柜子(session)失效。顾客 (http request)的忘性很大,管理员在顾客回去的时候(http response)都要重新提醒顾客记住自己的号码牌 (session id)。这样,顾客(http request)下次来的时候,就又带着号码牌回来了。 我们可以看到,session id实际上是 在客户端和服务端之间通过http request和http response传来传去的。

sessionid是怎么产生 的?

应该是第一次访问服务器的时候随即生成的.假如是111,然后他的登陆信息是true,服务器就知道sessionid为111的已经登陆了,这些信息都存在了服务器上了.
但当浏览者继续操作的时候,也就是打开该系统的另一个页面的时候sessionid怎么办?如何传递?
打开另一个页面的时候其实相当于重新访问系统,如果没有特殊的处理机制,系统会再次重新分配一个sessionid,这样的话就失去意义了!所以sessionid在第一次访问后 应该存在了客户端.
能存哪呢?当然,只能存在cookie中了,这就是为什么关闭cookie,session就失去作用了。

原创粉丝点击