网上有很多关于cookies和session的资料和讨论,但是基本上没有能形象的、系统的、完善的说清楚这两个概念的,所以决定写一篇关于cookies和session的文章
cookies
<1>首先说明,cookies是客户端上的数据,cookies数据是由客户端浏览器读写的,表现形式为cookies文件,cookies文件里保存着cookies数据;
<2>客户端每个浏览器都有其自己的cookie,这点要注意。相对于服务端,每个浏览器代表着一个客户端,而并不是一台客户电脑代表一个客户端,在开发过程中,有很多概念是相对的,比如,全局、并发、阻塞、事物等等都些相对的概念,分析具体情况的时候,要确认目前所处的层面和环境。所以,若果你电脑上装了多个浏览器firefox、chrome、ie等等吧,每个浏览器都有自己的cookies文件,每个浏览器也只能读写自己的cookies数据,并且具体的读写处理也不一样。举个例子,chrome的所有cookies数据是存放在一个文件中的,并且做了加密处理,所以chrome写cookies时会加密,读cookies会解密,如果你用文本处理工具打开chorme的cookies会发现乱码看不懂,就是因为chrome加密了不让你看,只有它自己懂;IE的cookies是分好多文件的,也没做加密处理,记事本打开就能看懂。
<3>再一点,就是大家要理清一个概念:cookies是浏览器保存的数据,跟服务器没有直接的关系,cookies要跟服务器扯关系的话也只是间接的,他们之间由浏览器作为桥梁。网上很多资料、包括很多书上讲
没错,这个说法是对的,但是,这只说明了cookies技术的初衷,其中隐藏的很多具体东西没有说清楚。
<4>我要给大家提个问题:浏览器给服务器发送数据,发送的数据从何而来??大家都明白,用户输入表单提交啊,url带上查询串啊。这只是发送数据的一部分,不全,那另一部分从何而来呢,从cookies。当浏览器不禁用cookies的时候,浏览器每一次的WEB请求,都会自动读取cookies数据发送给服务器。
<5>那cookies数据是怎么发送给服务器的??cookies数据在浏览器读取后,放在http请求头里边发给服务器,所以cookies是有长度限制的,原因就是http协议头有长度限制。
<6>浏览器端运行的JS提供了cookies的读写能力。JS读写cookies的知识就不在这说了,感兴趣的自己查下吧。
<7>前面说了,cookies数据是浏览器直接读写的,跟服务器的关系只是间接的,但是,做过WEB开发的都知道,服务器端代码有写cookies的能力,其中的纽带就是浏览器、http请求头/响应头、WEB服务器。WEB服务器给服务端语言提供接口,让服务端语言有修改设置http响应头的能力,cookies数据只是http头中的一部分。
<8>通过前边分析,大家应该这样理解cookies:cookies是http头的一部分,属于http协议的范畴,所谓客户端的cookies文件,只是浏览器将cookies持久存储,以便再用。
说cookies就会提到session,大家肯定经历过面试环节这样的提问:“cookies和session的区别?”,我比较讨厌这个问题的问法。cookies和session不是一个层面上的东西,无法像“这女孩比那女孩好看”这样比较,只能讨论之间的联系。接下来说分析session。
session
<1>session存储在服务端。每个应用服务器都有自己的session,比如一台机器上装了两服务器:php、asp.net,各有各的seesion存储。这里要提醒初学者,服务器和服务机器是两个概念。
<2>服务器开启session的话,服务端(准确来说是WEB服务器)会为每个请求的客户端生成一个ID,站在服务器的角度讲,这个ID就是客户端的标识、身份证,服务端可以将一些执行过程的数据下挂到这个ID下保存起来,比如,php会为每个客户端建立以ID为文件名的文件,里边存放数据,这就是session。
<3>理解session的时候,要分两部分分析,sessionID、session数据。
<4>大家想下,sessiion会有哪些用??页面传值?下次请求用?还有呢??
未完待续……