cookie 和session 的区别详解

来源:互联网 发布:网络广播电台软件 编辑:程序博客网 时间:2024/05/15 23:53

cookie 和session 的区别详解

这些都是基础知识,不过有必要做深入了解。先简单介绍一下。

二者的定义:

当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,

都纪录下来。当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie

里的内容来判断使用者,送出特定的网页内容给你。 Cookie 的使用很普遍,许多有提供个人化服务的网站,都是利用 Cookie

来辨认使用者,以方便送出使用者量身定做的内容,像是 Web 接口的免费 email 网站,都要用到 Cookie。


具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。

同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制

来达到保存标识的目的,但实际上它还有其他选择。

cookie机制。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示

浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用

是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围

大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
 
cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这

个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。

会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie

保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏

览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式

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

          当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识

(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来

使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相

关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应

中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给

服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时

仍然能够把session id传递回服务器。

经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器

会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如: 
<form name="testform" action="/xxx"> 
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> 
<input type="text"> 
</form> 
实际上这种技术可以简单的用对action应用URL重写来代替。

cookie 和session 的区别:

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
   考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
   考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、所以个人建议:
   将登陆信息等重要信息存放为SESSION
   其他信息如果需要保留,可以放在COOKIE中

 

好文要顶 关注我 收藏该文  
施杨
关注 - 0
粉丝 - 348
荣誉:推荐博客
+加关注
73
1
« 上一篇:讲解JSP过滤器和监听器 (转载)
» 下一篇:jQuery插件积累(转载)

posted on 2008-10-07 14:16 施杨 阅读(502555) 评论(39)  编辑 收藏

评论

#1楼   

当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 

都纪录下来。 

实在没有理解出这句话的意思
支持(0)反对(0)
2008-10-08 07:28 | 本本

#2楼[楼主]   

@本本 
其实这也不是一定的,取决于这个网站采取哪种机制,这句话不是重点,重点在后面。
支持(0)反对(0)
2008-10-08 09:54 | 施杨  

#3楼   

session id asp 里边是数字。
2009-07-18 21:09 | ASP learner

#4楼   

有一个问题想请教一下博主
session:在浏览器每次和服务器请求的时候都会在服务器上查找出session的信息,而cookie是浏览器每次请求的时候都会把自身信息发送的服务器上,这个说法是否正确?

如果正确,那么存储到cookie比存储到session所产生的流量会大一些是吗,这能否造成影响?

请博主指教
2009-10-22 17:27 | ilstar

#5楼[楼主]   

@ ilstar
不会造成什么影响,我觉得除了免登陆功能用cookie外,别的一律放session里就行。没必要考虑那么复杂
支持(0)反对(0)
2009-10-22 18:47 | 施杨  

#6楼   

假如说现在有这么个情况,一整个项目的某个模块,当在这个模块里进行操作的时候,会频繁用到一些参数,而使用该项目除该模块以外的部分时,这些模块是用不到的。博主对这个情况有什么好的方案吗?

无论是存到cookie还是session,在退出这个模块的时候这些参数还残留着,性能上(小网站的话)虽然无大碍,但总感觉怪怪的
2009-10-23 07:45 | ilstar

#7楼[楼主]   

@ ilstar
我会存到session,如果你觉得退出模块后有残留,那就清一下session。
支持(0)反对(0)
2009-10-23 08:25 | 施杨  

#8楼   

过期时间的区别呢?
支持(0)反对(0)
2012-09-13 21:14 | 唐小喵  

#9楼   

不错
支持(0)反对(0)
2012-09-28 12:03 | matt-1989  

#10楼   

我转载了你这篇文章了,在这里,http://blog.csdn.net/nnezhxw/article/details/8142390。已经按照要求写声明了:)
支持(0)反对(0)
2012-11-02 22:21 | 笨的无奈  

#11楼   

楼主讲的非常好,原理很清楚。再带上实例代码就好了。当然排排版也好
支持(0)反对(0)
2012-12-28 23:47 | 初学者心态  

#12楼   

说的挺清楚,我也转载了,谢谢!
支持(0)反对(0)
2013-01-09 13:31 | gaojun  

#13楼   

存储在硬盘上的cookie可以在不同的浏览器进程间共享,每个浏览器保存cookie的路径不同吧,楼主
支持(0)反对(0)
2013-03-29 17:16 | 在大地画满窗子  

#14楼   

学习了~ 谢谢楼主的清晰扼要的讲解
支持(0)反对(0)
2013-05-03 14:45 | elf_tech  

#15楼   

学习了~~~
支持(0)反对(0)
2013-05-10 16:22 | 苍海壹树  

#16楼   

总结的第四点貌似有问题:
单个cookie保存的数据不能超过4K,每个web服务器保存的cookie数不能超过20个(参照《javascript权威指南》)。
支持(0)反对(1)
2013-06-27 21:08 | peislin  

#17楼   


楼主觉得比如人人网的下次自动登录功能是怎么实现的呢?用户信息是存在cookie里面还是存在session里面的呢?
支持(0)反对(0)
2013-07-20 02:42 | chilam1989  

#18楼[楼主]   

@ chilam1989
你可以自己测试一下,先自动登录然后清除cookie,然后试试还能不能自动登录就行了。
支持(0)反对(0)
2013-07-20 03:53 | 施杨  

#19楼[楼主]   

@ peislin
5年前写的东西了,后来再也没改过,谢谢提醒。
支持(0)反对(0)
2013-07-20 03:55 | 施杨  

#20楼[楼主]   

@ 在大地画满窗子
我说的是同一款浏览器的不同进程,也就是多个浏览器窗口,而不是不同浏览器间共享。
支持(0)反对(0)
2013-07-20 03:58 | 施杨  

#21楼   

楼主请问是不是就是这么理解的,session和cookie都是服务器与客户机之前信息传递的一种机制,就跟post和get差不多。只不过session的主要信息体存在服务器其中还有一个对应的sessionid是存在客户端上的,而cookie的全部信息都是存在客户端的。除此之外的优点是session的sessionid有较高的安全性。这么理解可以吗?

还有几个问题:
第一
我发现楼主说一个客户机上可以有好多cookie,我对这句话的理解是,楼主这里指的cookie是一个信息单位,类似于数据库中的一个属性。 因为在存cookie时 有时候除了用户名和密码还需要存一些其他的信息,这其中每个信息都对应一个cookie。所以要存很多cookie。不知道是不是这么理解? 

第二
我在 w3c上面看session和cookie时发现,一个客户机可以有很多cookie,但是session没说,好像一个客户机只能有一个sessionid,而这个sessionid对应服务器端一个session数组,数组里的每个单位存的是一条数据,类似一条cookie。也就是说一个浏览器上只能存一个服务器的sessionid,这么理解对不?

第三
请问session的生命期限是多长时间,可以调吗?不可以的话,默认是多少呢?

谢谢楼主的分享
支持(1)反对(0)
2013-12-21 23:05 | Josdon  

#22楼   

cookie居然不安全?无法理解。http://shop108786168.taobao.com
支持(0)反对(9)
2014-03-12 14:48 | 刘成斌  

#23楼   

写的很好
支持(0)反对(1)
2014-11-10 20:45 | 规格严格-功夫到家  

#24楼   

@ Josdon
session需要使用cookie作为识别标志。HTTP协议是无状态的,session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的cookie,其值为该session的ID。该cookie为服务器自动生成的,maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时会生成两个不同的session。
支持(1)反对(0)
2014-12-10 18:33 | 哥吉拉  

#25楼   

将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中

很有道理~!
如果并发浏览的用户很多也尽量选择cookie,保存在客户端,不占用服务器资源。可以将cookie信息加密,提交到服务器后再解密。
支持(3)反对(0)
2014-12-10 18:39 | 哥吉拉  

#26楼   

我觉得楼主可以补充下Session、Cookie生命周期等。
支持(0)反对(0)
2015-03-27 17:54 | xiongyl  

#27楼   

楼主,可以转载不?
支持(0)反对(0)
2015-06-08 10:45 | 哈哈哈呵呵呵  

#28楼   

貌似都是浏览器端的吧
支持(0)反对(0)
2015-09-09 16:50 | 流泪的猫  

#29楼   

不错,分析的很明白
支持(0)反对(0)
2015-11-03 19:28 | 纸鸢&红豆·绿豆  

#30楼   

好!
支持(0)反对(0)
2016-02-01 17:39 | Ethan Shan  

#31楼   

老师,你讲的真好!
支持(0)反对(0)
2016-03-17 23:24 | He!!  

#32楼   

大神,你好,我是一个小菜鸟,在此向你请教一个问题。通过别人的接口编号,我们写程序生成二维码,第二次或多少次以后,将这个二维码,注销掉,该怎么么做,能不能用session
支持(0)反对(0)
2016-03-30 16:14 | love宇宇宇  

#33楼[楼主]   

@ love宇宇宇
可以用,你也可以学习下Redis,对你有帮助。
支持(0)反对(0)
2016-03-30 17:20 | 施杨  

#34楼   

@ 施杨
谢谢,大神,Redis这个是c语言的,我做的是Java的,能够引用吗
支持(0)反对(0)
2016-03-31 09:42 | love宇宇宇  

#35楼[楼主]   

@ love宇宇宇
Java也可以用Redis,你可以网上搜一下教程
支持(0)反对(0)
2016-03-31 10:30 | 施杨  

#36楼   

谢谢博主!
支持(0)反对(0)
2016-06-22 20:59 | NavyRunner  

#37楼   

写的很好,很清晰明了
支持(0)反对(0)
2016-06-23 10:53 | 王者无双  

#38楼   

涨姿势了。
原创粉丝点击