带你全面了解cookie

如何使用cookie

cookie是保存在客户端系统中的一个文本文件,都与指定的Web服务器的域中的固定目录相关联。
当浏览器向服务器请求该目录下的页面时,关联的cookie信息就会随着HTTP请求以头部信息的方式发送给服务器。
在客户端,用户可以使用JavaScript读写cookie信息,服务器端脚本也能够编辑这些cookie信息。


cookie的优点主要表现

  • 简单易用

  • 浏览器负责发送数据

  • 浏览器自动管理不同站点的cookie
    经过长期使用,cookie也越来越暴露出先天的不足,具体说明如下

  • 使用简单的文本文件储存数据,安全性很差,很容易被黑客窃取

  • cookie 中存储的数据容量有限,其上限为4KB

  • 存储cookie的数量有限,多数浏览器上限为30或50个,如IE6只支持每个域名20个cookie,也有部分浏览器存储cookie的数量高达300个

  • 如果浏览器的安全配置为最高级别,则cookie会失效

  • cookie不适合大数据的储存,因为cookie会由每个服务器的请求来传递,从而造成cookie速度缓慢、效率低下

写入cookie信息

  • 使用 document.cookie 可以读写cookie字符串信息
  • cookie字符串是一组明值对,名称和值之间以等号相连,名值对之间使用分号进行分隔。值中不能包含分号、逗号和空白符。如果包含特殊字符,必须使用 escape()函数对其进行编码,在读取cookie时也必须使用unescape()函数进行解码。
如何使用cookie存储cookie信息

var d = new Date();
d = d.toString();
d = "date=" + escape(d);  // 设置 cookie字符串
document.cookie = d;   //  写入cookie

在默认状态下,cookie信息只能在当前会话期(当前浏览器窗口)中有效并存在,一旦结束会话(关闭浏览器窗口),这些cookie信息就会被自动删除。
如果长久保存cookie信息,可以设置expires属性,把字符串"expires=date" 附加到cookie字符串后面,用法如下

name = value; expires = date
date为格林威治日期时间(GTM)格式:Sun,30 Apr 2017 00:00:00 UTC
使用 Date.toGMTString()方法可以快速把时间对象转换为GTM格式。

创建一个有效期为一个月的cookie

var d = new Date();     // 实例化当前日期对象
d.setMonth(d.getMonth() + 1);  // 提取月份值并加1,然后重新设置当前日期对象
d = "date=" + escape(d) + ";expires=" +d.toGMTString();  // 在cookie字符串的尾部添加expires 名值对

document.cookie = d;  // 写入cookie

cookie 信息是有域和路径限制的。在默认情况下,仅在当前页面路径内有效。其它域或本域其它目录中的文件是无权访问的。
用户可以使用cookie 的 path和domain属性重设可见路径和作用域。

name = value; expires=date; domain=domain; path=path;

如果设置 path=/, 可以设置cookie信息与服务器根目录与其子目录相关联,从而实现在整个网站中共享cookie信息;如果只想让bbs目录下的页面访问,可以设置path=/bbs即可。

很多网站包含多个域名 ,在默认情况下,cookie信息只能在本域中访问,通过设置cookie的domain属性可修改域的范围。domain = baidu.com即可。这样所有baidu.com 的所有子域下的所有页面相关联,包括www、news、tieba等。

cookie使用secure属性定义cookie信息的安全性。secure属性取值包括secure或者空字符串。在默认情况下,secure属性值为空,也就是说cookie信息使用不安全的HTTP链接传递数据。如果一个cookie设置了secure,那么cookie信息在客户端与Web服务器之间传递时,就通过HTTPS或者其他安全协议传递数据

综上所述,比较完善的cookie信息字符串应该包括下面几个部分

  • cookie信息字符串,包含一个名/值对,默认为空
  • cookie有效期,包含一个GTM格式的字符串,默认为当前会话期(即如果没有设置,则当关闭浏览器时,cookie信息就因过期而被清除)
  • cookie有效路径,默认为cookie所在页面目录及其子目录
  • cookie有效域,默认为设置cookie的页面所在的域
  • cookie安全性,默认为不采用安全加密措施进行传递

下面把写入cookie信息的实现代码进行封装

//  写入cookie
//  参数 name表示cookie名称,value表示cookie值,expirs表示有效天数,path表示有效路径,domain表示域,secure表示安全性设置。其中name、value、path、和domain参数为字符串类型,传递时需要加上引号,而参数expirs为数值,secure表示布尔值,表示是否加密传输cookie信息
//  返回值:无

function setCookie( name,value,expires,path,domain,secure){
     var today = new Date();
     today.setTime( today.getTime());
     if(expires){
        expires = expires * 1000 * 60 * 60 * 24;
     }
     
     var expires_date = new Date( tody.getTime() + (expires) );
     document.cookie = name + "=" + escape(value) +
       ( (expires) ? ";expires=" + expires_date.toGTMString()  : "" )  +
       ( (path) ? ";path=" + path : ""  ) +
       ( (domain) ? ";domain="  +domain : "") +
       ( (secure) ? ";secure="  : "" );

}

读取cookie信息

访问 document.cookie可以读取cookie信息,cookie属性值是一个由零个或多个名值对的字符串组成的字符串列表,每个名值对之间通过分号进行分隔。

把cookie字符串转换成对象类型

//  把cookie字符串转换为对象类型
//  参数:无
//  返回值:对象,储存cookie信息,其中名称作为对象的属性而存在,而值作为属性值而存在

function getCookie(){       
   var  a  =  document.cookie.split(";");   //  把cookie字符串分为数组
   var  o  = { };                        //  临时对象直接量
   for(var i = 0;i<a.length; i++){    //  遍历数组
        var  v = a[i].split("=");       //  劈开每个数组元素
        o[v[0]] = v[1];      //  把元素的名和值转换为对象的属性和属性值
   
   }
    return o;     //  返回对象
}

如果写入cookie进行了编码,读取时要记得解码

===================

// 在实际开发中,更多的操作是直接读取某个cookie值,而不是读取所有cookie信息。

// 读取指定cookie信息
// 参数:cookie名称
// 返回值:cookie值

function getCookie(name){
       var start = document.cookie.indexOf(name + " = "); // 提取cookie中与名称相同的字符串索引
       var len = start + name.length + 1;  // 计算值的索引位置
       if((!start)&&(name!=document.cookie.subString(0,name.length))){
       // 不存在则返回null    此处的判断就是需要注意0是false
       return  null;
       }
       if(start == -1) return null;  //  如果没有找到,则返回null
       var end = document.cookie.indexOf(";",len);//  获取值后面“;”的索引位置
       if(end == -1) end = documen.cookie.length; // 如果索引值为-1,设置为cookie字符串的长度
       return unescape(documen.cookie.substring(len,end));//  获取名称对应的截取值,并解码返回
}

修改和删除cookie信息

如果要改变指定cookie的值,只需要使用相同名称和新值重新设置该cookie即可。如果要删除某个cookie信息,只需要为该cookie设置一个已过期的expires属性值

//  封装一个删除指定cookie信息的方法,这个方法需要调用getCookie()函数

// 删除指定cookie 信息
// 参数:name表示cookie名称,path表示所在路径,domain表示所在域
// 返回值

function deleteCookie(name,path,domain){
    if(getCookie(name)) document.cookie = name + " = "+  //  如果名称存在,则清空
     ((path)?";path=" + path : "")+   // 如果存在路径,则加上
     ((domain)? ";domain=" +domain : "")+  // 如果存在域,则加上
     "expires=Thu,01-Jun-1970 00:00:01 GTM";
     // 设置有效期为过去时,即表示该cookie无效,将会被浏览器清除
}


附加cookie信息

切记请勿滥用cookie浏览器对cookie都有个数限制,为了避免超出这个限制,可以把多条信息都保存在一个cookie中,而不是为每条信息都新建一个cookie。由于cookie可存储的字符串最大长度为4kb(即4096个字符)

//  在cookie中存储更多的信息。

//  定义有效期
var d = new Date();
d.setMonth(d.getMonth() + 1);
d = d.toGMTString();
// 定义cookie字符串
var a = " name:a,age:20,addr:beijin"  //子名/值串
var c = "user=" + escape(a)    // 组合cookie字符串
c += ";" + "expires=" +d;   // 设置有效期为1个月
document.cookie = c;   //  写入cookie信息




©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • 背景在HTTP协议的定义中,采用了一种机制来记录客户端和服务器端交互的信息,这种机制被称为cookie,cooki...
    时芥蓝阅读 2,360评论 1 17
  • 原文链接:https://segmentfault.com/a/1190000004556040[https://...
    R_X阅读 420评论 0 1
  • HTTP cookies,通常称之为“cookie”,已经存在很长时间了,但是仍然没有被充分理解。首要问题是存在许...
    NoFacePeace阅读 473评论 0 1
  • 细说Cookie 阅读目录 开始 Cookie 概述 Cookie的写、读过程 使用Cookie保存复杂对象 Js...
    拉肚阅读 1,096评论 0 4
  • 一、简介 提起Java不得不说的一个开发场景就是Web开发,也是Java最热门的开发场景之一,说到Web开发绕不开...
    __元昊__阅读 3,592评论 1 9