什么是Cookie?什么是Session?
比较官方的解释:由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,Cookie便是这种机制。而Session主要可以用来保存一些用户信息,可以承载各种数据,只要客户端的 Cookie 传来一个唯一的 Session ID,服务器就可以找到对应的 session,认出该客户。
这样的解释比较书面,但要是没有一些基础,这样的解释看着很头大的了,可能有些不知所云。下面我来说一下具体的作用。
cookie
大话Cookie
cookie的翻译为小饼干。什么意思呢?比如去同学家做客,同学看到你来了,非常开心,端出很多小饼干来招待你。对应到服务器这边。服务器就是你的同学家,你的同学(服务器端)看到你(客户端)来了,然后就给你小饼干。
那么小饼干给你有什么用呢?在这里就只能吃了。
换一个例子,可能这个小饼干的作用就能体现出来了。
你(客户端)考上了清华大学(服务器端),你去报道以后清华大学给了你一个学生证(cookie)。当你下次再进入清华大学的时候,清华大学的门卫大叔并不知道你是清华大学的学生,当你亮出你的学生证以后(cookie),门卫大叔便知道你是清华大学的学生了,爽快的就把大门打开让你进去。但若是你的学生证丢了,门卫大叔说不定就得把你拦下,一番盘问:你是谁?你来自哪里?你要进清华大学干什么?这样难免就会有很多麻烦事了。
从B站看Cookie的作用
如下所示:我在浏览器中登录了B站的账号。
当我关闭浏览器再打开,然后再进入B站的的网站,会发现我的账号依然保持登录状态(如图2,图3所示)。这便是cookie的一个作用。当我第一次登录以后,浏览器会把我的登录信息保存到浏览器(本地的cookie文件)中,相当于是给了客户端一个标签,标识这个客户端有“权限”访问该网站。当客户端下次再带着自己的cookie文件访问B站的时候,服务器通过标签一眼就能认识这个客户端,就不用再重新验证客户端的身份,客户端就可以不用麻烦地再次输入用户名和密码,直接就可以进入网站的主界面了。
到这里就可以看出cookie的作用了。客户端访问某个站点的时候,服务端给客户端一个“标记”,用来唯一标识客户端的身份,就好像是上面的例子中的学生证一样,客户端下次访问服务端的时候带上这个标记,服务器端一看到这个标记就知道你来了,那么客户端不需要再输入用户名和密码进行验证就能直接登录进去了。
Session
大话Session
说完了cookie又继续来说说Session。Session的英文意思是会话,什么叫做会话呢?两个人坐着,面对面交谈,你说一句,我说一句,这便可以理解为简单的会话。但是提到会话,我们更多的应该是想到的是一些正式的场面。比如两个公司的老总坐在一起谈合作,这可以叫会话。这样的会话,一般都会有一个秘书在旁边,做一下会议记录,对于一些老总忘记的事情,秘书还能进行提醒,如果是不同国家的老总,可能还会有翻译在现场。
我们打开浏览器,在浏览器中进入某个网址,然后在该网站里面进行一系列操作,比如浏览页面,播放视频,这都可以理解为会话。可以理解为客户端(浏览器)和服务器端(所访问的网址)之间的会话。为了保证会话的顺利进行,客户端和服务端还需要一个类似于上述所说的秘书的的角色,而Session则可以担任这个角色。
这该怎么理解呢?比如我进入了B站,我点击某个视频,那么浏览器就会发一个请求给服务器端,服务器端收到了这个请求,就把这个视频的资源下发到我的客户端,然后客户端才能进行播放。我们播放一个视频也好,浏览某个界面也好,都不单单是客户端或者服务器端的作用,需要两者的协同,这就和会话一样,一个人说叫自言自语,两个人你一言,我一语才能叫做会话。
我们还是继续以你考入清华大学那个例子来说说Session。
有了cookie(学生证),你进出清华大学的校门都很方便,只需要把你的学生证亮出来,你就能畅通无阻进出校门,保安大叔不会阻拦你。
但是当你进入清华大学以后,你还能畅通无阻吗?你去找人办事也好,还是说你想去申请什么资源也好,还是说你想结识很多优秀的人也好,你这时候拿出你的学生证,说:“我叫xxx,你能帮我做点事情吗?我能请你帮个忙吗?我能申请学校某个实验室的资源吗?我以前很优秀,我能和优秀的你做朋友吗?”
这时候,别人可能都不愿意鸟你。你是谁?实验室的仪器这么宝贵,为什么给你用?我为什么听你的,我这么优秀,我为什么要和你做朋友?
当人家问你是谁的时候,问的不是你的名字,而是你的背景,你的人脉以及你的能力。这样的实力才是你在学校畅通无阻的保证。
如果你说,“我爹是校长”。好,你的背景有了,你就可以在学校畅通无阻了。
而如果你没背景,你就得提升你的能力。你的GPA年级第一,你参加过很多竞赛,拿了很多奖,你在顶级期刊发表了很多论文,你创业非常成功,登上了报纸…你做了这么多,就能让别人知道你是谁,也能回答你是谁。你在学校竞选学生会主席,自我介绍的时候你说起自己的这些成就。台下人惊呼:“哇,我知道,他是xxx,我在某某报纸上看到过他”。有了这些实力做支撑,你在学校也就畅通无阻了。
好了,回到Session这里来。
cookie的作用是让你下次进入某个网站的时候,不需要输入密码进行验证就能直接登录。而session要做的事情就是你登录以后的事情。就像是你考入清华大学以后,你得思考,你要凭借什么能力才能在清华大学这个顶尖学府立足,怎么才能畅通无阻。
从B站看Session的作用
还是拿小破站来说事。
张三登录B站,收藏夹也好,创作中心也好,历史记录也好,都是张三这个账号的。李四登录B站,看到的是李四的收藏夹,创作中心,历史记录。我们作为使用者,觉得这很正常,我登自己的账号,当然出现的是我的记录呀,这有什么奇怪的。
但其实也没这么简单。我们自己写一个程序,在本地运行,A界面跳转到B界面,A显示什么,B显示什么,这都是已经预定好的。但是B站虽然称为小破站,月均用户量也是破亿的,不可能说B站为张三写个程序,这个程序专门用来显示张三的收藏夹,历史记录,为李四也专门写一个,专门用来显示李四的相关数据。一亿用户,用的都是同一套程序。那么当处于历史记录这个界面的时候,B站该怎么知道此时应该显示张三,还是该显示李四的历史记录。那这个就可以靠Session来实现,服务器端将用户信息保存在Session中,不同的页面都可以获取到Session中的信息,当我们进入某个界面的时候,应该是会先验证你的用户信息,核对你是谁,然后根据你是谁,来具体显示属于你的账号的内容,这样我们就可以在登录自己的淘宝账号以后去不同的页面选购,登录B站以后,也可以进入不同的页面去浏览。
进入清华大学以后,你的实力(背景,人脉,能力)能保证你畅通无阻;而当你进入某个web应用以后,Session则可以保证你在不同的界面之间都能来回跳转,畅通无阻,显示属于你的账号的东西。
当我们登录某个网站以后,该网站对应的服务端会给客户端发送一个session对象,一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在。session里面可以保存用户的信息,然后用户就可以在这个网站的不同页面之间跳转。
当我保持登录的状态的时候,可以跳转到收藏页面,创作中心,投稿界面等。
如下所示:当我们未登录的时候,很多界面我们是无法访问的。
当我们未登录B站的时候,就得不到服务器端发过来的session对象,或者说是session对象里就没有存储任何关于用户的信息,在跳转界面的时候,另一个界面无法从session中获取到关于你的账户的信息,就无法保证你是谁,自然就得先让你登录。
总结
- Cookie保存至用户的本地端,Session保存在服务器端
- Cookie 的容量一般限制在4KB,不适合存储大量的数据。它的作用主要就是服务器给每个客户端(浏览器)打标签,方便服务器辨认,确认你是谁,就好像是进入清华大学拿到的学生证。
- Session 也是保存数据的,能保存的数据量比cookie大,在同一个web程序的不同页面进行跳转的时候可以用来保存你的用户信息,进入淘宝的话可以保存你的购物车信息等。
- Session对象由服务器创建,Cookie这个标签也是由服务器端为客户端贴上去的。
服务器怎么把信息发给客户端:通过响应
客户端怎么与服务器怎么取得联系:通过请求
思考:哪个是服务端,哪个是客户端?
java web程序应该是服务端,浏览器则是客户端。客户端通过HttpGet与服务器端取得联系。
关于HTTP无状态的思考
现在再来看HTTP,对于它是无状态这一点。应该也可以做一些思考了。就像清华大学的保安大叔一样,你去报道的那一天,他还和你打过招呼,你以为他已经认识你了,结果当你忘带学生证被拦在校门外的时候,你伸冤:大叔呀,报到那天你不是还看到我了吗,我们还打招呼了,你怎么今天就不认识我了,我真的是清华大学的学生,不过我忘记带学生证了,你就让我进去吧。
保安大叔十有八九记不住了,每天过往的学生这么多,他怎么可能都记住。对比保安大叔,这里的HTTP协议也是,它也是健忘的,它负责传输数据,但是数据的具体内容它不保留,甚至处理完数据以后,马上就忘记它处理过这堆数据了。
不过想想也对,我登录B站,HTTP记住了我登录了B站,把我的账号信息都保存了,我登录网银,HTTP记住了我的登录信息,银行卡啥的啥都都给我记住了。对于我们来说,这可不是什么好事,大大增加了我们账号被盗,财产被盗的风险。记不住也好,HTTP只管传输,至于传输的数据,它不去触碰,这样就能保证属于你的私人信息不会因为HTTP而被泄露出去。
若有不足,欢迎指正