天天看点

cookie和session机制

一、cookie和session机制之间的区别和联系

1、cookie机制

cookie意为“甜饼”,是由w3c组织提出,最早由netscape社区发展的一种机制。目前cookie已经成为标准,所有的主流浏览器如ie、netscape、firefox、opera等都支持cookie。

cookie的含义是“服务器送给浏览器的甜点”,即服务器在响应请求时可以将一些数据以“键-值”对的形式通过响应信息保存在客户端。当浏览器再次访问相同的应用时,会将原先的cookie通过请求信息带到服务器端。

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

查看某个网站颁发的cookie很简单。在浏览器地址栏输入javascript:alert(document. cookie)就可以了(需要有网才能查看)。

注意:cookie功能需要浏览器的支持。

如果浏览器不支持cookie(如大部分手机中的浏览器)或者把cookie禁用了,cookie功能就会失效。

不同的浏览器采用不同的方式保存cookie。

ie浏览器会在“c:\users\administrator\appdata\roaming\microsoft\windows\cookies”文件夹下以文本文件形式保存,一个文本文件保存一个cookie。其中administrator改为自己的电脑名称。

cookie具有不可跨域名性。根据cookie规范,浏览器访问google只会携带google的cookie,而不会携带baidu的cookie。google也只能操作google的cookie,而不能操作baidu的cookie。

cookie在客户端是由浏览器来管理的。浏览器能够保证google只会操作google的cookie而不会操作 baidu的cookie,从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站cookie的依据是域名。google与baidu的域名不一样,因此google不能操作baidu的cookie。

需要注意的是,虽然网站images.google.com与网站www.google.com同属于google,但是域名不一样,二者同样不能互相操作彼此的cookie。

注意:用户登录网站www.google.com之后会发现访问images.google.com时登录信息仍然有效,而普通的cookie是做不到的。这是因为google做了特殊处理。本章后面也会对cookie做类似的处理。

http协议不仅是无状态的,而且是不安全的。使用http协议的数据不经过任何加密就直接在网络上传播,有被截获的可能。使用http协议传输很机密的内容是一种隐患。如果不希望cookie在http等非安全协议中传输,可以设置cookie的secure属性为true。浏览器只会在https和 ssl等安全协议中传输此类cookie。

2、session机制

当多个客户端执行程序时,服务器会保存多个客户端的session。获取session的时候也不需要声明获取谁的session。session机制决定了当前客户只会获取到自己的session,而不会获取到别人的session。各客户的session也彼此独立,互不可见。

而session机制采用的是一种在客户端与服务器之间保持状态的解决方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的。而session提供了方便管理全局变量的方式。

session是针对每一个用户的,变量的值保存在服务器上,用一个session id来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。

就安全性来说:当你访问一个使用session的站点,同时在自己机子上建立一个cookie,建议在服务器端的session机制更安全些。因为它不会任意读取客户存储的信息。

正统的cookie分发是通过扩展http协议来实现的,服务器通过在http的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。

从网络服务器观点看所有http请求都独立于先前请求。就是说每一个http响应完全依赖于相应请求中包含的信息。

状态管理机制克服了http的一些限制并允许网络客户端及服务器端维护请求间的关系。在这种关系维持的期间叫做会话(session)。

cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。ietf rfc 2965 http state management mechanism是通用cookie规范。网络服务器用http头向客户端发送 cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies

二、理解session机制

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

1、session的生命周期

session保存在服务器端。为了获得更高的存取速度,服务器一般把session放在内存里。每个用户都会有一个独立的session。如果session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,session里的信息应该尽量精简。

session在用户第一次访问服务器的时候自动创建。需要注意只有访问jsp、servlet等程序时才会创建session,只访问html、image等静态资源并不会创建session。如果尚未生成session,也可以使用request.getsession(true)强制生成session。

session生成后,只要用户继续访问,服务器就会更新session的最后访问时间,并维护该session。用户每访问服务器一次,无论是否读写session,服务器都认为该用户的session“活跃(active)”了一次。

2、客户端使用cookie

当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识-称为sessionid,如果已包含一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一 个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个

sessionid将被在本次响应中返回给客户端保存。

保存这个sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个 cookie的名字都是类似于seeesionid。比如weblogic对于web应用程序生成的cookie,jsessionid = byok3vjfd75apnrf7c2hmdnv6qzcebzwowibyenlerjq99zwpbng!-145788764,它的名字就是jsessionid。

3、客户端使用url重写

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

1)一种是作为url路径的附加信息,表现形式为http://...../xxx;jsessionid=byok3vjfd75apnrf7c2hmdnv6qzcebzwowibyenlerjq99zwpbng!-145788764

2)另一种是作为查询字符串附加在url后面,表现形式为http://...../xxx?jsessionid=byok3vjfd75apnrf7c2hmdnv6qzcebzwowibyenlerjq99zwpbng!-145788764

  这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把sessionid的信息和正常程序参数区分开来。

注意:tomcat判断客户端浏览器是否支持cookie的依据是请求中是否含有cookie。尽管客户端可能会支持cookie,但是由于第一次请求时不会携带任何cookie(因为并无任何cookie可以携带),url地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入cookie了,因此url地址重写后的地址中就不会带有jsessionid了。

三、总结 

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

  在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做logoff的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存sessionid,而关闭浏览器后这个

sessionid就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的http请求头,把原来的sessionid发送给服务器,则再次打开浏览器仍然能够找到原来的session。

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

参考之:

http://blog.csdn.net/fangaoxin/article/details/6952954

继续阅读