官方理解:cookie机制Cookies是服务器存储在本地机器上的一小段文本,随着每次请求发送到同一个服务器。IETFRFC2965HTTP状态管理机制是一个通用的cookie规范。Web服务器使用HTTP标头向客户端发送cookie。在客户端,浏览器解析这些cookie并将它们保存为本地文件。它会自动将这些cookie附加到来自同一服务器的任何请求。具体来说,cookie机制采用了客户端维护状态的方案。它是客户端会话状态的一种存储机制,需要用户在客户端启用cookie支持。cookies的作用是为了解决HTTP协议的无状态缺陷而做出的努力。正统的cookie分发是通过扩展HTTP协议实现的,服务器通过在HTTP响应头中加入一行特殊说明来提示浏览器生成相应的cookie。但是,JavaScript等纯客户端脚本也可以生成cookie。cookies的使用是浏览器根据一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookies,如果某个cookie声明的范围大于或等于所请求资源的位置,则将cookie附加到所请求资源的HTTP请求头中,发送给服务器.cookie的内容主要包括:名称、值、过期时间、路径和域。路径与域一起构成了cookie的范围。如果没有设置过期时间,则意味着cookie的生命周期是在浏览器会话期间。当浏览器窗口关闭时,cookie将消失。这种生命周期为浏览器会话的cookie称为会话cookie。会话cookies一般不存储在硬盘上,而是存储在内存中。当然,这种行为不是由规范指定的。如果设置了过期时间,浏览器会将cookie保存到硬盘,关闭后再次打开浏览器,这些cookie仍然有效,直到超过设置的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程之间共享,比如两个IE窗口。对于存储在内存中的cookies,不同的浏览器有不同的处理方式。会话机制使用一种解决方案来维护服务器端的状态。同时我们也看到,由于服务器端的状态保持方案也需要在客户端保存一个标识符,所以session机制可能需要使用cookie机制来达到保存标识符的目的。会话提供了一种方便的方式来管理全局变量。该会话针对每个用户。变量的值保存在服务器上。sessionID用于区分哪个用户会话变量。这个值在用户访问时通过浏览器返回给服务器。当客户端禁用cookies时,也可能设置这个Values通过get返回给服务端。安全方面:当你访问一个使用session的站点,在自己的机器上创建cookie时,建议服务器端的session机制更加安全,因为它不会随意读取客户端存储的信息。SESSION机制会话机制是一种服务器端机制。服务器使用类似于哈希表的结构(或者它可能使用哈希表)来保存信息。当程序需要为客户端的请求创建一个会话时,服务器首先检查客户端的请求是否已经包含了一个会话标识符(称为sessionid)。如果包含,说明之前已经为这个client创建了一个session,server会根据sessionid获取session并使用(如果获取不到,会创建一个新的),如果clientrequest不包含sessionid,则为该client创建一个session,并生成一个与该session关联的sessionid,sessionid的值应该是一个既不重复又不易被模仿的字符串。这个sessionid会在这个response中返回给客户端保存。Cookies可以用来保存sessionid,这样浏览器在交互过程中就可以自动按照规则向服务器显示这个id。通常,此cookie的名称类似于SEEESIONID。但是cookies是可以人为禁止的,必须要有其他的机制才能在cookie被禁止的时候,sessionid仍然可以传回服务器。一种经常使用的技术称为URL重写,即将sessionid直接附加到URL路径。还有另一种技术称为表单隐藏字段。即服务器会自动修改表单,增加一个隐藏字段,以便在提交表单时将sessionid传回服务器。Cookie和Session都可以进行会话跟踪,只是完成原理不同。一般情况下,两者都可以满足需求,但有时不能用Cookie,有时又不能用Session。下面通过对比说明两者的特点和适用场合。1、根据访问方式的不同,Cookie中只能存储ASCII字符串。如果需要访问Unicode字符或二进制数据,则需要先对它们进行编码。Cookie不能直接访问Java对象。要存储稍微复杂的信息,使用cookie比较困难。Session可以访问任何类型的数据,包括但不限于String、Integer、List、Map等。Session还可以直接存储JavaBeans甚至是任何Java类、对象等,使用起来非常方便。您可以将Session视为Java容器类。2.不同的隐私政策。Cookie存储在客户端浏览器中,并且对客户端可见。客户端上的一些程序可能会窥探、复制甚至修改cookie的内容。Session保存在服务器端,对客户端透明,不存在敏感信息泄露风险。如果选择cookies,更好的办法是尽量不要将账户密码等敏感信息写入cookies。诀窍是像谷歌、百度一样对cookie信息进行加密,提交到服务器后再进行解密,确保cookie中的信息只有本人才能阅读和理解。而如果选择Session的话,会省去很多麻烦。反正放在服务器上,Session中的任何隐私都可以得到有效的保护。3、有效期的区别用过谷歌的人都知道,如果你登录过谷歌,你的谷歌登录信息将长期有效。用户不必每次访问都重新登录,谷歌会永久记录用户的登录信息。要达到这种效果,使用cookies会是更好的选择。你只需要将cookie的过期时间属性设置为一个非常大的数字即可。由于Session依赖于名为JSESSIONID的Cookie,而CookieJSESSIONID的过期时间默认为-1,只要关闭浏览器,Session就会失效,所以Session无法达到信息永久有效的效果。使用URL地址重写也是不行的。而如果session超时时间设置的过长,服务器积累的session越多,越容易造成内存溢出。4、服务器压力下的不同session存储在服务器端,每个用户都会产生一个session。如果并发访问的用户很多,会产生很多Session,消耗大量内存。所以像谷歌、百度、新浪这样并发访问量极高的网站,不太可能使用Session来跟踪客户会话。但是cookies是保存在客户端的,不占用服务器资源。如果有很多用户同时浏览,Cookie是一个不错的选择。对于谷歌、百度、新浪来说,Cookie可能是唯一的选择。5、浏览器支持的不同cookies需要客户端浏览器支持。如果客户端禁用cookie,或不支持cookie,会话跟踪将失败。对于WAP上的应用程序,传统的cookies是没有用的。如果客户端浏览器不支持cookies,则需要使用Session和URL地址重写。需要注意的是,所有使用Session程序的URL都必须重写,否则Session跟踪将失效。对于WAP应用,Session+URL地址重写可能是其唯一的选择。如果客户端支持cookie,可以设置cookie在本浏览器窗口和子窗口有效(设置过期时间为-1),也可以设置在所有浏览器窗口都有效(设置过期时间为大于0的整数)。但是Session只能在本浏览器窗口及其子窗口中有效。如果两个浏览器窗口互不相关,它们将使用两个不同的Session。(IE8下不同windows下的session相关)6.不同cookiesoncross-domainsupport支持跨域访问。例如,如果域属性设置为“.biaodianfu.com”,则所有以“.biaodianfu.com”为后缀的域名都可以访问该cookie。跨域cookie现在在互联网上被广泛使用,如谷歌、百度、新浪等,Session不支持跨域访问。session只在他的域名范围内有效。只用Cookie或者只用Session都不一定能达到预期的效果。这时候你应该尽量同时使用Cookie和Session。Cookie和Session的结合在实际项目中会达到很多意想不到的效果。我的理解:1、由于HTTP协议是无状态协议,当服务器端需要记录用户的状态时,需要使用某种机制来识别具体的用户。这种机制就是Session。典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议是无状态的,你不知道是哪个用户在操作,所以服务端需要为特定的用户创建一个特定的Session来识别用户和跟踪用户,以便知道购物车中有多少本书。这个Session保存在服务器端,有唯一标识。服务器端保存Session的方式有很多种,包括内存、数据库、文件等。集群的时候还要考虑Session的传递。在大型网站中,通常会有专门的Session服务器集群来保存用户会话。这个时候,Session的信息是保存在内存中的,会用到一些缓存服务,比如Memcached。让我们把会议。2.想想服务器是如何识别特定客户的?这就是Cookie发挥作用的时候。每次发起HTTP请求,客户端都会向服务器发送相应的cookie信息。事实上,大多数应用程序都使用cookie来实现会话跟踪。第一次创建session时,服务器会通过HTTP协议告诉客户端,需要在cookie中记录一个sessionID。这个会话ID被发送到服务器,我知道你是谁。有人问,如果客户端的浏览器禁用cookies怎么办?一般这种情况下,会话跟踪会使用一种叫做URL重写的技术,即每次HTTP交互,都会在URL后面附加一个sid=xxxxx这样的参数,服务器据此来识别用户。3、其实cookies也可以用在一些方便用户使用的场景中。想象一下,您已经登录过一次网站,下次登录时不想再次输入您的帐户。你该怎么办?此信息可以写入cookie。在访问网站时,网站页面的脚本可以读取这些信息并自动为您填写用户名,方便用户使用。这也是Cookie名字的由来,给用户一点甜头。所以,总结一下:Session是一种保存在服务器端的数据结构,用来跟踪用户的状态。这些数据可以保存在集群、数据库和文件中;Cookie是客户端保存用户信息的一种机制,用来记录一些用户信息,也是Session的一种实现方式。1.状态维护。http协议是无状态的:每次请求都是一个新的请求,不会记住之前的通信状态。客户端和服务器之间的通信是一个会话。状态维护的实现方式:在客户端或者服务端存储会话相关的数据。存储方式包括cookie和session。会话一般是指会话对象。使用cookie,所有数据都存储在客户端。注意不要存储敏感信息。推荐使用sesison模式,所有数据都存储在server端,在client端,将session_id存储在clientcookie中。状态保持的目的是在一段时间内跟踪请求者的状态,实现对当前请求者数据的跨页面访问。注意:此数据不会在不同的请求者之间共享。与请求者一一对应2.启用session(例如Django)使用django-adminstartproject创建的项目默认启用在settings.py文件中INSTALLED_APPS列表项添加:'django.contrib.sessions',和MIDDLEWARE_CLASSES列表项Add:'django.contrib.sessions.middleware.SessionMiddleware',disablesession:删除上面指定的两个值,disablesession会节省一些性能消耗3.使用session启用session后,每个HttpRequestobject会有一个session属性,是一个类似字典的objectget(key,default=None):根据key获取session的值clearallsessionsflush():删除当前会话数据,删除会话Cookie。delrequest.session['uname']:删除会话4.会话过期时间。set_expiry(value):设置会话超时时间。如果未指定,如果值为a,则将在两周后过期整数,会话将在values不活动秒数后过期。如果value是一个timedelta对象,会话将在当前时间加上指定的日期/时间过期。如果值为0,则用户会话cookie将在用户浏览器服务器关闭时过期。如果值为None,会话将永不过期
