cookie和session的介绍

cookie

cookies是服务器在本机上存储的小段文本,并伴随每次请求发送至服务器。HTTP头向客户端发送cookies,在客户端浏览器解析这些cookies,并把它们保存为本地文件。

cookie使用是浏览器按照一定的原则在后台自动发送给服务器。

cookie的主要内容有:名字,值,过期时间,路径和域。路径和域一起构成cookie的作用范围。如果不设置过期时间,有效时间是会话期间。如果设置了过期时间,浏览器将会把cookie放到硬盘上,关闭后再打开浏览器,cookie的过期时间仍旧是设置的时间。

session是在一种在服务端保持状态的解决方案,由于服务端保持状态的方案在客户端也需要保存一个标识,session机制需要借助cookie机制来保存标识的目的,而session他提供了方便管理的全局变量的方式。

session是针对每一个用户的,变量值保存在服务器上,用一个sessionID来区别哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务端。禁用cookie时,可能需要由get来返回给服务器。

session

服务端使用类似于散列表的结构保存信息。

当程序需要某个客户端请求创建一个session时,服务器首先检查这个客户端的请求是否包含了session的标志,如果已经包含则说明以前已经为此客户端创建过session,服务器就照session id把这个session检索出来使用,如果客户端请求不包含session id,则为此客户端创建session并生成一个与此session相关联的session id。

session id:一个既不会重复又不容易被找到规律的字符串,这个session id在本次响应中返回给客户端保存。

保存session id的方式采用cookie,交互过程中浏览器自动按照规则把标识发回给服务器。但是cookie能够被认为的禁止,就需要使用URL重写技术,把session id附加在url路径的后面,还有一个表单隐藏字段,服务器会自动修改表单,添加一个隐藏字段,一遍能够在表单提交时把session id传递给服务器。

cookie和session能够进行会话的跟踪,但完成原理不同。

存取方式不同

cookie中只保管ASCII字符串,假如需求需要存取unicode字符或二进制数据,需求先进行编码。cookie也不能存取java对象。

session能够存取任何类型的数据,包括但不限于string,integer,list,map等,session中也能够直接保管java bean乃至任何java类,对象等。运用起来十分便当,能够把session看成一个java容器类。

隐私策略不同

cookie存储在客户端的阅读器上,对客户端是可见的,客户端的一些程序可能会窥探、复制、修正cookie中的数据。

session在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。

cookie中,比较好的方法是敏感信息,如账号密码,尽量不要写到cookie中,像google,baidu那样将cookie进行加密,提交到服务器后进行解密,保证cookie只有本人能读的懂。

session在服务器上,session里的任何隐私都有足够有效的保护。

有效期不同

在egg.js中,cookie中能够设置这一个键值对的失效时间,session就只能全局的有效期,session默认存放于cookie中,如果我们的session对象过于庞大,会带来一些额外的问题:

  • 浏览器通常都有限制最大的cookie长度,当设置session过大时,浏览器可能拒绝保存。
  • cookie在每次请求时都会带上,当session过大时,每次请求都要额外带上庞大的cookie信息。

如果设置的session的超时时间长,服务器累计的session就会越多,容易招致内存溢出。

服务器压力不同

session是保管在服务端,每个用户都会产生一个session,假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存,可以使用扩展存储,redies。

cookie是保管在客户端的,不占用服务器的资源,如果并发阅读的用户比较多,cookie是一个比较好的选择。

浏览器支持不同

cookie是需要客户端浏览器支持的,假如浏览器禁用了cookie或者不支持cookie,则会会话跟踪失效,常规的cookie就派不上用场了。

假如客户端不支持cookie就需要运用session以及URL的地址重写。一切用到session的程序的url都需要进行地址重写,否则session会话跟踪还会失效。WAP应用来说,session+url重写或许是他唯一的选择。

假如客户端支持cookie,则cookie既能够设为本浏览窗口及子窗口有效(把过期时间设为-1),也能够设为一切阅读器窗口内有效(把过期时间设为某个大于0的整数)。但session只能在本阅读器窗口以及子窗口内有效。假如两个浏览器窗口不相干,则运用的是不同的sesison。(IE8下不同的窗口session不相干)。

跨域支持上不同

cookie支持跨域名访问,例如将domain属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”为后缀的一切域名均能够访问该Cookie。也就是说二级域名的cookie,一级域名的也能用。

理解

客户端第一次发送请求给服务器,此时服务器产生一个唯一的sessionID,并返回给客户端(通过cookie),保存于客户端的内存中,并与一个浏览器窗口对应着,由于HTTP协议的特性,这一次链接就断开了。

此客户端再发送请求给服务器的时候,就会在请求request中携带cookie,由于cookie中有sessionID,所以服务器就知道这是刚才那个客户端。

使用方法:cookie

设置cookie:

document.cookie="name="+username;

读取cookie:

var username=document.cookie.split(";")[0].split("=")[1];
//JS操作cookies方法!
//写cookies
function setCookie(name,value)
{
var Days = 30;
var exp = new Date();
exp.setTime(exp.getTime() + Days*24*60*60*1000);
document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
}

读取cookies:

function getCookie(name)
{
var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
if(arr=document.cookie.match(reg))
return unescape(arr[2]);
else
return null;
}

删除cookies:

function delCookie(name)
{
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval=getCookie(name);
if(cval!=null)
document.cookie= name + "="+cval+";expires="+exp.toGMTString();
}
//使用示例
setCookie("name","hayden");
alert(getCookie("name"));
//如果需要设定自定义过期时间
//那么把上面的setCookie 函数换成下面两个函数就ok;
//程序代码
function setCookie(name,value,time)
{
var strsec = getsec(time);
var exp = new Date();
exp.setTime(exp.getTime() + strsec*1);
document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
}
function getsec(str)
{
alert(str);
var str1=str.substring(1,str.length)*1;
var str2=str.substring(0,1);
if (str2=="s")
{
return str1*1000;
}
else if (str2=="h")
{
return str1*60*60*1000;
}
else if (str2=="d")
{
return str1*24*60*60*1000;
}
}
//这是有设定过期时间的使用示例:
//s20是代表20秒
//h是指小时,如12小时则是:h12
//d是天数,30天则:d30
setCookie("name","hayden","s20");

猜你喜欢

转载自blog.csdn.net/qq_33589252/article/details/83314605