首先用一个简单的生活例子了解Cookie和Session ;
星巴克开始优惠活动,每消费10杯咖啡,会免费赠送1杯。考虑到一个人一次性消费10杯咖啡几乎不可能,所以需要采取某种方式来记录顾客的消费数量。
解决方案:
1)店员很厉害,每个顾客的消费记录都记得一清二楚;
2)分给顾客一张卡片,每消费一次记录一次;
3)发给顾客一张卡片,上面有卡号,顾客每消费一次,由店员在操作机上记录一次。
分析:方案一的可执行性几乎为0。方案二和方案三我们都见过。 而方案二和三正是对应的客户端记录和服务端记录。与之相对应的正是cookie和session。
cookie的内容主要包括name(名字)、value(值)、maxAge(失效时间)、path(路径),domain(域)和secure六部分内容
- name:cookie的名字,一旦创建,名称不可更改。
- value:cookie的值,如果值为Unicode字符,需要为字符编码。如果为二进制数据,则需要使用BASE64编码.
- maxAge:cookie失效时间,单位秒。如果为正数,则该cookie在maxAge后失效。如果为负数,该cookie为临时cookie,关闭浏览器即失效, 浏览器也不会以任何形式保存该cookie。如果为0,表示删除该cookie。默认为-1
- path:该cookie的使用路径。如果设置为"/sessionWeb/",则只有ContextPath为“/sessionWeb/”的程序可以访问该cookie。如果设置为“/”,则本域名下ContextPath都可以访问该cookie。
- domain:域.可以访问该Cookie的域名。第一个字符必须为".",如果设置为".google.com",则所有以"google.com结尾的域名都可以访问该cookie",如果不设置,则为所有域名
- secure:该cookie是否仅被使用安全协议传输。
Session是一种服务端的机制,服务器使用一种类似散列表的结构来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端里的请求里是否已包含了一个session标识--sessionID,
如果已经包含一个sessionID,则说明以前已经为此客户端创建过session,服务器就按照sessionID把这个session检索出来使用
如果客户端请求不包含sessionID,则为此客户端创建一个session并且声称一个与此session相关联的sessionID,
sessionID的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串(服务器会自动创建),这个sessionID将被在本次响应中返回给客户端保存。
cookie和session的区别:
- 存储位置不同: Cookie:存放在客户端计算机中(浏览器内存/硬盘),Session:存放在服务端计算机内存中,具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的。
- 数据类型不同: ookie对象存储共享数据类型只能是String, Session对象可以存储任意类型的共享数据.
- 数据数量不一样: 一个Cookie对象只能存储一个共享数据,Session使用map集合存储共享数据,可以存储任意数量共享数据.
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
- 单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie。
- 一般为了安全,可以将登陆信息等重要信息存放为session。
使用cookie的缺点:
- 如果浏览器使用的是cookie,那么所有的数据都保存在浏览器端,
- cookie可以被用户禁止
- cookie不安全(对于敏感数据,需要加密)
- cookie只能保存少量的数据(大约是4k),cookie的数量也有限制(大约是几百个),不同浏览器设置不一样,反正都不多
- cookie只能保存字符串
- 对服务器压力小
使用session的缺点:
- 一般是寄生在Cookie下的,当Cookie被禁止,Session也被禁止
- 当然可以通过url重写来摆脱cookie
- 当用户访问量很大时,对服务器压力大
- 我们现在知道session是将用户信息储存在服务器上面,如果访问服务器的用户越来越多,那么服务器上面的session也越来越多, session会对服务器造成压力,影响服务器的负载.如果Session内容过于复杂,当大量客户访问服务器时还可能会导致内存溢出。
- 用户信息丢失, 或者说用户访问的不是这台服务器的情况下,就会出现数据库丢失.
本文共 1244 个字数,平均阅读时长 ≈ 4分钟
评论 (0)