什么是 cookie
有时候,服务器需要保存用户的信息,这些信息最好放在用户的电脑上,并能够让服务器获取。例如自动登录功能的实现,需要将用户名和密码保存在本地,下次访问网站时,再将用户名和密码发送到服务器进行验证,验证通过后自动登录,否则不能登录。 这些服务器在用户电脑上保存的信息,就叫 cookie 。 cookie 保存在用户的电脑上,当再次访问相应网站时,浏览器会把 cookie 一起发送到服务器,让服务器进行处理。 cookie 可以由服务器端程序(PHP、ASP、JSP、Python)生成,也可以由客户端脚本(JavaScript)生成。服务器生成的 cookie 会添加到 http 报头,随 http 请求发送给浏览器,浏览器再把它保存成本地的文件;JavaScript生成的 cookie 直接由浏览器保存在本地文件。 cookie 也是随 http 请求发送给服务器的,当浏览器发送 http 请求时,会将 cookie 添加到 http 请求的报头发送到服务器,再由服务器进行处理。为什么需要 cookie
HTTP协议是无状态的,对于一个浏览器发出的多次请求,服务器无法区分是不是来源于同一个浏览器,需要额外的数据来辨认,cookie 正是这样的一段随HTTP请求一起被传递的额外数据。cookie能做什么
cookie 只是一段文本,所以它只能保存字符串。而且浏览器对它有大小限制以及 它会 随着每次请求被发送到服务器,所以应该保证它不要太大。 Cookie的内容也是明文保存的,有些浏览器提供界面修改,所以, 不适合保存重要的或者涉及隐私的内容。cookie 的限制
大多数浏览器支持最大为 4096 字节的 Cookie。 由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。 浏览器还限制网站可以在用户计算机上存储的 Cookie 的数量。 大多数浏览器只允许每个网站存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。cookie 的形式
cookie 是以 键/值 对的形式存在的,每个“ 变量 ”对应一个值,相互之间以分号隔开,如下所示:
username=itxueyuan;password=123456;age=22总结:cookie通常用来保存服务器的信息(或者说维持会话),由服务端程序或者JavaScript脚本写入,在后续请求中,供服务器读取。修改和删除cookie
JavaScript 通过 document.cookie 来修改和删除 cookie 。
JavaScript 在设置 cookie 时会遵循这样一条原则:新设置的 cookie 如果与原有的 cookie 相同(名称、路径和域名都相同),会将原有的 cookie 覆盖(采用新 cookie) 。这就给我们提供了一种修改和删除 cookie 的方法——直接覆盖原有的 cookie 。例如,有这样一个 cookie:username=itxueyuan;expire=1369929124191;path=/;domain=www.itxueyuan.org将用户名修改为“JavaScript”,并设置一天后过期:var date=new Date();var cookieExpire=date.getTime()+24*3600*1000;// 修改 cookie 时,名称、路径和域名必须相同document.cookie=" username=JavaScript ; expire= " + cookieExpire + " ;path=/;domain=www.itxueyuan.org ";
删除该cookie
var date=new Date();var cookieExpire=date.getTime()-1000; // 设置为一个过去的时间// 删除 cookie 时,名称、路径和域名必须相同document.cookie=" username=JavaScript ; expire= " + cookieExpire + " ;path=/;domain=www.itxueyuan.org ";
注:为了删除一个cookie,可以将其过期时间设定为一个过去的时间
JavaScript设置cookie
在JavaScript中,使用 document.cookie 来设置 cookie 。 语法: document.cookie=" name=value ; expire=GMT_String ; path=cookieDir ; domain=cookieDomain "
请看下面几个设置 cookie 的例子。 最简单的 cookie 设置:
键/值 对 | 说明 |
---|---|
name=value | 必需。设置cookie的名称和值,一次只能设置一个。在cookie的名称或值中不会出现分号( ; )、逗号( , )、等号( = )、空格以及中文等,否则将会被浏览器编码。在cookie的名称中做到这点很容易(名称一般是开发人员设定好的),但是保存的值是不确定的,如何来存储这些值呢?方法是用escape()函数进行编码,它能将一些特殊符号使用十六进制表示,例如空格将会编码为“20%”,从而可以存储于cookie值 中,而且使用此种方案还可以避免中文乱码的出现。 例如,将“小明”存入cookie: document.cookie="username="+eacape("小明"); |
expire=GMT_String | 可选。设置cookie的过期时间。默认情况下(不设置expire),用户关闭浏览器时会销毁cookie,这些cookie仅仅是存储在内存中,而没有建立相应的硬盘文件。在实际开发中,cookie 通常需要长期保存,例如保存用户登录的状态,可以通过设置 cookie 的过期时间来实现。 过期时间是以GMT格式表示的时间字符串,超过这个时间,cookie将消失,不可访问。 例如,如果要将cookie设置为10天后过期: var date=new Date(); // 更多请参考 var expireDays=10; date.setTime(date.getTime()+expireDays*24*3600*1000); |
path=cookieDir | 可选。设置cookie的有效路径。默认情况下(不设置path),cookie只在当前路径下有效,路径范围之外不能访问该cookie。例如,在 /javascript/jiaocheng/ 路径下设置的cookie,只能被 /javascript/jiaocheng/ 路径下的文件以及子目录下的文件访问。 要使 cookie 全站有效,请设置 path=/ 。 |
domain=cookieDomain | 可选。设置cookie的有效域名。默认情况下(不设置 domain),cookie 只在当前域名下有效。例如,在 demo.itxueyuan.org 下设置的 cookie ,不能在 javascript.itxueyuan.org 域名下访问。 要使 cookie 在 itxueyuan.org 的所有二级域名和主域名下都有效,请设置domain=.itxueyuan.org |
document.cookie=" name=xiaoming ";
对 cookie 的值进行 escape() 编码:
var cookieValue=" 小明 ";document.cookie=" name= "+escape(cookieValue) ;
设置有效路径为全站有效:
document.cookie=" name=xiaoming ; path=/ ";
设置过期时间为 1 天:
var date=new Date(); // 创建日期对象var cookieExpire=date.getTime()+24*3600*1000; // 以微妙计算document.cookie=" name=xiaoming ; expire= "+cookieExpire;
举例,将IT学院会员的用户名和密码保存到cookie,过期时间一个月,全站有效,所有域名有效:
var username="小明";var password="123456";var expire=(new Date()).getTime()+1000*3600*24*30;document.cookie = " username=" + escape(username) + " expire=" + expire + " ; path=/ ; domain=.itxueyuan.org ";document.cookie = " password=" + escape(password) + " expire=" + expire + " ; path=/ ; domain=.itxueyuan.org ";
JavaScript获取cookie
JavaScript 通过 document.cookie 来获取 cookie 。 遗憾的是,document.cookie 只能获取所有 cookie 的集合,不能获取单个 cookie 。 例如,获取当前cookie集合: 我们可以自定义一个函数来获取单个 cookie 的值。 我们知道,cookie 集合的格式是这样的: name1=value1 ; name2=value2 ; name3=value3 ; ... 将 cookie 以分号(;)分组,再以等号(=)分组,就能得到每个 cookie 的名称和值。/** * func getCookie() 获取单个cookie的值 * pram cookieName cookie的名称**/function getCookie(cookieName){ var cookieObj={},cookieSplit=[],// 以分号(;)分组 cookieArr=document.cookie.split(";"); for(var i=0,len=cookieArr.length;i
例如,获取 name 的值:
getCookie["name"];
对上面的代码稍作修改,就可将 cookie 的值保存为对象的属性,使用时非常方便。代码如下:
/** * func getCookieObj() 获取所有cookie的值并将其保存为对象的属性**/function getCookieObj(){ var cookieObj={},cookieSplit=[], // 以分号(;)分组 cookieArr=document.cookie.split(";"); for(var i=0,len=cookieArr.length;i
例如,获取 name 的值:
var cookieObj=getCookieObj();cookieObj.name;