JavaScript Cookie 机制详解:设置、读取、删除与通用函数封装

作者:拾光

时间:2026-10-29

浏览:525

本文详细介绍 JavaScript 中 Cookie 的核心机制及其实际应用。内容涵盖 Cookie 的概念、存储原理、安全性限制,以及通过 document.cookie 进行名值对设置、特殊字符编码、过期时间管理、路径与域名控制的具体方法。此外,文章提供了获取、删除 Cookie 的逻辑解析,并封装了 addCookie、getCookie 和 deleteCookie 三个通用处理函数,帮助开发者实现代码复用与高效管理。

文章目录

JavaScript Cookie 机制概述

Cookie 概述


在前一章节中,我们曾利用一个固定不变的框架来存储购物车数据,而商品展示页面则是动态变化的。虽然这种方式能模拟全局变量的效果,但存在严谨性不足的问题。例如,若在导航框架页面内右键点击快捷菜单中的【刷新】命令,所有 JavaScript 变量都会随之丢失。因此,若需实现严格的跨页面全局变量共享,此方法并不可靠。JavaScript 提供的另一种机制——Cookie,则能够满足真正的全局变量需求。


Cookie 是浏览器提供的一种机制,它将 document 对象的 cookie 属性暴露给 JavaScript 进行控制,这并非 JavaScript 语言本身的固有特性。Cookie 实际存储于用户硬盘的一个文件中,该文件通常与特定域名相关联。当浏览器再次访问该域名时,便会读取并使用这个 Cookie。因此,Cookie 可以在同一个域名下的多个网页间共享,但无法跨越不同的域名使用。


尽管不同浏览器对 Cookie 的实现方式各异,但其本质性质相同。例如,在 Windows 2000 及 Windows XP 系统中,Cookie 文件存储于 documents and settings\userName\cookie\ 文件夹下。其命名格式通常为:userName@domain.txt。


Cookie 机制将信息存储于用户硬盘,因此可作为全局变量使用,这是其最大优势。它主要适用于以下几种场景。


保存用户登录状态。例如,将用户 ID 存储于一个 Cookie 内,这样当用户下次访问该页面时便无需重新登录,目前许多论坛和社区均提供此类功能。Cookie 还可设置过期时间,超过期限后 Cookie 将自动失效。因此,系统通常会提示用户选择保持登录状态的时间,常见选项包括一个月、三个月或一年等。


跟踪用户行为。例如,一个天气预报网站可根据用户选择的地区显示当地天气。若每次访问都需重新选择所在地则显得繁琐,利用 Cookie 后体验将更为人性化:系统能记住上一次访问的地区,当下次打开页面时,自动显示上次用户所在地区的天气情况。由于这一切均在后台完成,此类页面仿佛为特定用户定制,使用极为便捷。


定制页面。若网站提供换肤或更换布局功能,可使用 Cookie 记录用户选项,例如背景色、分辨率等。当用户下次访问时,仍可保留上一次访问的界面风格。


创建购物车。正如前例中使用 Cookie 记录用户需购买的商品一样,在结账时可统一提交。例如,淘宝网使用 Cookie 记录用户曾经浏览过的商品,方便随时进行比较。


当然,上述应用仅是 Cookie 能完成的部分功能,还有更多需要全局变量的场景。Cookie 的缺点主要集中在安全性和隐私保护方面,主要包括以下几种情况。


Cookie 可能被禁用。当用户高度重视个人隐私保护时,他们很可能禁用浏览器的 Cookie 功能;


Cookie 是与浏览器相关的。这意味着即使访问的是同一个页面,不同浏览器之间所保存的 Cookie 也是无法互相访问的;


Cookie 可能被删除。因为每个 Cookie 都是硬盘上的一个文件,因此很有可能被用户手动删除;


Cookie 安全性不够高。所有的 Cookie 均以纯文本形式记录于文件中,因此若要保存用户名、密码等信息,最好事先经过加密处理。


Cookie 的设置与管理

设置 Cookie


每个 Cookie 都是一个名/值对,可以将如下字符串赋值给 document.cookie:


document.cookie="userId=828";


若要一次存储多个名/值对,可以使用分号加空格(; )进行分隔,例如:


document.cookie="userId=828; userName=hulk";


在 Cookie 的名或值中不能使用分号(;)、逗号(,)、等号(=)以及空格。在 Cookie 的名中做到这点很容易,但要保存的值往往是不确定的。如何存储这些值呢?方法是用 escape() 函数进行编码,它能将一些特殊符号使用十六进制表示,例如空格将会编码为“20%”,从而可以存储于 Cookie 值中,而且使用此种方案还可以避免中文乱码的出现。例如:


document.cookie="str="+escape("I love ajax");


相当于:


document.cookie="str=I%20love%20ajax";


当使用 escape() 编码后,在取出值以后需要使用 unescape() 进行解码才能得到原来的 Cookie 值,这在前面已经介绍过。


尽管 document.cookie 看上去就像一个属性,可以赋不同的值。但它和一般的属性不一样,改变它的赋值并不意味着丢失原来的值,例如连续执行下面两条语句:


document.cookie="userId=828";


document.cookie="userName=hulk";


这时浏览器将维护两个 Cookie,分别是 userId 和 userName,因此给 document.cookie 赋值更像执行类似这样的语句:


document.addCookie("userId=828");


document.addCookie("userName=hulk");


事实上,浏览器就是按照这样的方式来设置 Cookie 的,如果要改变一个 Cookie 的值,只需重新赋值,例如:


document.cookie="userId=929";


这样就将名为 userId 的 Cookie 值设置为了 929。



Cookie 值的读取与解析

获取 Cookie 的值


下面介绍如何获取 Cookie 的值。Cookie 的值可以由 document.cookie 直接获得:


var strCookie=document.cookie;


这将获得以分号隔开的多个名/值对所组成的字符串,这些名/值对包括了该域名下的所有 Cookie。例如:


<script language="JavaScript" type="text/javascript">


<!--

document.cookie="userId=828";


document.cookie="userName=hulk";


var strCookie=document.cookie;


alert(strCookie);


//-->

</script>


图 7.1 显示了输出的 Cookie 值。由此可见,只能够一次获取所有的 Cookie 值,而不能指定 Cookie 名称来获得指定的值,这正是处理 Cookie 值最麻烦的一部分。用户必须自己分析这个字符串,来获取指定的 Cookie 值,例如,要获取 userId 的值,可以这样实现:


<script language="JavaScript" type="text/javascript">


<!--

//设置两个 Cookie


document.cookie="userId=828";


document.cookie="userName=hulk";


//获取 Cookie 字符串


var strCookie=document.cookie;


//将多 Cookie 切割为多个名/值对


var arrCookie=strCookie.split("; ");


var userId;


//遍历 Cookie 数组,处理每个 Cookie 对


for(var i=0;i<arrCookie.length;i++){


var arr=arrCookie[i].split("=");


//找到名称为 userId 的 Cookie,并返回它的值


if("userId"==arr[0]){


userId=arr[1];


break;


      }
}

alert(userId);


//-->

</script>


这样就得到了单个 Cookie 的值



用类似的方法,可以获取一个或多个 Cookie 的值,其主要的技巧仍然是字符串和数组的相关操作。



Cookie 过期时间与删除

给 Cookie 设置终止日期


到现在为止,所有的 Cookie 都是单会话 Cookie,即浏览器关闭后这些 Cookie 将会丢失,事实上这些 Cookie 仅仅是存储在内存中,而没有建立相应的硬盘文件。


在实际开发中,Cookie 常常需要长期保存,例如保存用户登录的状态。这可以用下面的选项来实现:


document.cookie="userId=828; expires=GMT_String";


其中 GMT_String 是以 GMT 格式表示的时间字符串,这条语句就是将 userId 这个 Cookie 设置为 GMT_String 表示的过期时间,超过这个时间,Cookie 将消失,不可访问。例如:如果要将 Cookie 设置为 10 天后过期,可以这样实现:


<script language="JavaScript" type="text/javascript">


<!--

//获取当前时间


var date=new Date();


var expireDays=10;


//将 date 设置为 10 天以后的时间


date.setTime(date.getTime()+expireDays*24*3600*1000);


//将 userId 和 userName 两个 Cookie 设置为 10 天后过期


document.cookie="userId=828; userName=hulk; expire="+date.toGMTString();


//-->

</script>



删除 Cookie


为了删除一个 Cookie,可以将其过期时间设定为一个过去的时间,例如:


<script language="JavaScript" type="text/javascript">


<!--

//获取当前时间


var date=new Date();


//将 date 设置为过去的时间


date.setTime(date.getTime()-10000);


//将 userId 这个 Cookie 删除


document.cookie="userId=828; expire="+date.toGMTString();


//-->

</script>


Cookie 路径与域名控制

指定可访问 Cookie 的路径


默认情况下,如果在某个页面创建了一个 Cookie,那么该页面所在目录中的其他页面也可以访问该 Cookie。如果这个目录下还有子目录,则在子目录中也可以访问。例如在 www.xxxx.com/html/a.html 中所创建的 Cookie,可以被 www.xxxx.com/html/b.html 或 www.xxx.com/ html/ some/c.html 所访问,但不能被 www.xxxx.com/d.html 访问。


为了控制 Cookie 可以访问的目录,需要使用 path 参数设置 Cookie,语法如下:


document.cookie="name=value; path=cookieDir";


其中 cookieDir 表示可访问 Cookie 的目录。例如:


document.cookie="userId=320; path=/shop";


就表示当前 Cookie 仅能在 shop 目录下使用。


如果要使 Cookie 在整个网站下可用,可以将 cookie_dir 指定为根目录,例如:


document.cookie="userId=320; path=/";




指定可访问 Cookie 的主机名


和路径类似,主机名是指同一个域下的不同主机,例如:www.google.com 和 gmail.google.com 就是两个不同的主机名。默认情况下,一个主机中创建的 Cookie 在另一个主机下是不能被访问的,但可以通过 domain 参数来实现对其的控制,其语法格式为:


document.cookie="name=value; domain=cookieDomain";


以 google 为例,要实现跨主机访问,可以写为:


document.cookie="name=value;domain=.google.com";


这样,所有 google.com 下的主机都可以访问该 Cookie。




通用 Cookie 处理函数封装

综合示例:构造通用的 Cookie 处理函数


Cookie 的处理过程比较复杂,并具有一定的相似性。因此可以定义几个函数来完成 Cookie 的通用操作,从而实现代码的复用。下面列出了常用的 Cookie 操作及其函数实现。


1.添加一个 Cookie:addCookie(name,value,expireHours)


该函数接收 3 个参数:Cookie 名称,Cookie 值,以及在多少小时后过期。这里约定 expireHours 为 0 时不设定过期时间,即当浏览器关闭时 Cookie 自动消失。该函数实现如下:


<script language="JavaScript" type="text/javascript">


<!--

function addCookie(name,value,expireHours){


var cookieString=name+"="+escape(value);


//判断是否设置过期时间


if(expireHours>0){


var date=new Date();


date.setTime(date.getTime+expireHours*3600*1000);


cookieString=cookieString+"; expire="+date.toGMTString();


      }

document.cookie=cookieString;


}
//-->

</script>


2.获取指定名称的 Cookie 值:getCookie(name)


该函数返回名称为 name 的 Cookie 值,如果不存在则返回空,其实现如下:


<script language="JavaScript" type="text/javascript">


<!--

function getCookie(name){


var strCookie=document.cookie;


var arrCookie=strCookie.split("; ");


for(var i=0;i<arrCookie.length;i++){


var arr=arrCookie[i].split("=");


if(arr[0]==name)return arr[1];


      }

return "";


}
//-->

</script>


3.删除指定名称的 Cookie:deleteCookie(name)


该函数可以删除指定名称的 Cookie,其实现如下:


<script language="JavaScript" type="text/javascript">


<!--

function deleteCookie(name){


var date=new Date();


date.setTime(date.getTime()-10000);


document.cookie=name+"=v; expire="+date.toGMTString();


}
//-->

</script>

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章