1.1饼干
cookie是存储在客户端计算机中的少量数据。如果服务器需要记录用户的状态,它会向客户端浏览器发出一个cookie,客户端浏览器会保存这个cookie。

当浏览器再次请求网站时,浏览器将所请求的URL连同cookie一起提交给服务器。服务器检查cookie以识别用户状态。服务器可以保存、读取、修改和删除cookie的内容。
操纵cookie的API已经定义和实现了很长时间,但是这些API没有提供保存、读取、修改和删除的方法。对cookie的所有操作都是通过特殊格式的字符串读写文档对象的cookie属性来完成的。
因为所有新老浏览器都支持cookie,所以仍然被客户端程序员广泛使用。本节将介绍如何通过Javascript保存、读取、修改和删除cookie的值。
1 . 1 . 1 cookie的存储
每个cookie都以名称/值对的形式保存。要存储cookie,只需将document对象的cookie属性设置为一个字符串值。比如:
document . cookie = " userId = Gates ";
如果希望一次存储多个名称/值对,需要使用“分号加空 case”来分隔名称/值对。比如:
document.cookie = " userId = Gates密码= 123 ";
由于cookie的名称或值中不允许使用分号、逗号、等号和空大小写,所以可以在存储之前使用Javascript的全局函数对值进行编码。
document.cookie看起来像一个属性,可以被赋予不同的值。但它不同于一般的属性,重复赋值也不会丢失原来的值。例如,连续执行以下两条语句:
document . cookie = " userId = Gates ";
document . cookie = " password = 123 ";
这时,浏览器会维护两个cookie,即userId和password。可以看出,document.cookie实际上是一个容器。当给它赋值时,如果名称不存在,将向容器添加一个名称/值对;如果该名称存在,对应于该名称的值将被修改。
除了名称和值,cookie还有一些可选属性来控制它们的有效期、范围等。这些属性是最大年龄、路径、域和安全,如下所述。
最大年龄
cookies的默认值只在浏览器的会话期间有效,即浏览器关闭后,这些cookies将会丢失。通过设置max-age属性,可以以秒为单位指定cookie的有效期。格式是:
document.cookie = " name = valuemax-age = maxAge ";
如果maxAge为正,则表示在maxAge秒后删除cookie如果为负,则该cookie为临时cookie,当您关闭浏览器时该cookie将失效,浏览器不会以任何形式保存该cookie;如果为0,则删除cookie。默认值为-1。
如果maxAge是正数,浏览器将把cookie数据保存在一个文件中。无论客户是关闭浏览器还是关闭电脑,只要还是maxAge秒前,cookie在登录网站时仍然有效。
以下函数用于设置cookie的值。cookie的有效天数由daysToLive参数设置。如果daysToLive为0,cookie将被删除。可以看出,该函数定义的cookie的max-age属性是可选的。
函数setcookie {
var cookie = name+" = "+encodocomponent;
如果
cookie+= ";max-age = "+;
document.cookie = cookie
}
小路
默认情况下,cookie与创建它的页面相关。如果在页面上创建了cookie,则该页面及其所在目录中的其他页面也可以访问cookie。如果该目录下有子目录,也可以在子目录中访问。可以通过path属性指定cookie的可见范围,格式为:
document.cookie = " name = valuepath = cookieDir ";
其中cookiesDir表示可以访问cookie的目录。设置path属性后,来自同一Web服务器的网页可以共享cookie,只要它们的URL以指定的路径前缀开头。例如,如果在http://www.xxxx.com/catalog/index.html创建了一个cookie,并将路径设置为“/order/”,那么这个cookie将对订单目录及其子目录中的页面可见。如果路径设置为“/”,则cookie将对整个网站可见。注意,cookieDir的最后一个字符必须是“/”。
领域
默认情况下,cookie是不能跨域名访问的,同一个域名下的两个二级域名是不能互相访问cookie的,因为它们的域名并不严格相同。

然而,对于大型网站,通常需要在子域之间共享cookie。例如,域名为order.xxx.com的服务器想要读取域名为catalog.xxx.com的cookie。此时可以通过domain属性设置可以访问cookie的域名。格式是:
document.cookie = " name = valuedomain = cookieDomain ";
其中cookieDomain表示可以访问cookie的域名。如果设置为“. xxx.com”,所有以“. xxx.com”结尾的域名都可以访问此cookie。请注意,cookieDomain的第一个字符必须是“.”。
如果没有为cookie设置域属性,则域属性的默认值是当前域名。而且cookie的域名只能设置为当前服务器的域名。
安全的
HTTP协议不仅无状态,而且不安全。使用HTTP协议的数据不经过任何加密直接在网络上传播,有被拦截的危险。所以使用HTTP协议传输机密内容会有安全隐患。
您可以通过secure属性设置是否使用安全协议在网络上传输cookie。格式是:
document.cookie = " name = value安全=安全";
安全属性属于布尔类型,其默认值为false。如果不希望cookie以HTTP等非安全协议传输,可以将其设置为true。如果secure属性设置为true,则只有当浏览器和服务器通过HTTPS或其他安全协议连接时,才能传递该属性。
读取cookie
可以直接通过document.cookie读取cookie的内容:
var strcookie = document.cookie
此时strcookie是由域名下所有cookie的名称/值对组成的字符串,名称/值对之间用“分号加空”分隔。为了便于查看,您可以使用split方法解析出cookie中的名称/值对,并获得一个cookie列表。然后,使用相应的解码方法来恢复cookie值。
cookie的解码方式取决于先前存储cookie时使用的编码方法。例如,如果使用encodeComponent函数对值进行编码,则使用decodeComponent函数对值进行解码。代码如下:
函数getcookie {
var cookies = document.cookie
var list = cookies.split//分析名称/值对列表
对于{
var arr = list[i]。分裂;//解析名称和值
如果
返回decodeURIComponent//解码cookie值
}
返回“”;
}
描述:
许多浏览器不支持直接访问本地文件中的cookie,因此请确保在Web服务器中打开这些文件,否则您可能无法读写cookie。虽然IE允许读写本地文件的cookie,但是cookie始终是会话级的,即使cookie的生存期被max-age属性延长。
当从客户端读取cookie时,除名称和值之外的属性不可读,也不会被提交。浏览器将只提交名称和值属性。
修改cookie要修改cookie,您只能使用同名的cookie来覆盖原始cookie。比如:
document.cookie = " userId = Bill
这样,名为userId的cookie值就变成了Bill。同样,设置新的max-age属性可以更改原始cookie的有效期。

删除cookie
如果cookie的max-age属性值为0,则表示该cookie已被删除。cookie机制并没有提供删除cookie的方法,所以可以通过设置cookie立即过期来达到删除cookie的效果。浏览器将从cookie文件或内存中删除无效的cookie。比如:
函数delcookie {
setcookie
}


