一 Cookie的格式及其组成
Cookie由变量名和值组成,类似
Javascript变量。其属性里既有标准的Cookie变量,也有用户自己创建的变量,属性中变量是用“变量=值”形式来保存。
根据Netscape公司的规定,Cookie格式如下:
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
NAME=VALUE:
这是每一个Cookie均必须有的部分。NAME是该Cookie的名称,VALUE是该Cookie的值。在字符串“NAME=VALUE”中,不含分号、逗号和空格等字符。
Expires=DATE:Expires变量是一个只写变量,它确定了Cookie有效终止日期。该属性值DATE必须以特定的格式来书写:星期几,DD-MM-YY HH:MM:SS GMT,GMT表示这是格林尼治时间。反之,不以这样的格式来书写,系统将无法识别。该变量可省,如果缺省时,则Cookie的属性值不会保存在用户的硬盘中,而仅仅保存在内存当中,Cookie文件将随着浏览器的关闭而自动消失。
Domain=DOMAIN-NAME:Domain该变量是一个只写变量,它确定了哪些Internet域中的Web服务器可读取浏览器所存取的Cookie,即只有来自这个域的页面才可以使用Cookie中的信息。这项设置是可选的,如果缺省时,设置Cookie的属性值为该Web服务器的域名。
Path=PATH:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie。一般如果用户输入的URL中的路径部分从第一个字符开始包含Path属性所定义的字符串,浏览器就认为通过检查。如果Path属性的值为“/”,则Web服务器上所有的WWW资源均可读取该Cookie。同样该项设置是可选的,如果缺省时,则Path的属性值为Web服务器传给浏览器的资源的路径名。
可以看出我们借助对Domain和Path两个变量的设置,即可有效地控制Cookie文件被访问的范围。
Secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时,浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即为HTTPS。
二
三 Cookie类
/*
* Cookie类
*/ /*
* 构造函数 -- 用指定的名字和可选的性质为指定的document创建一个Cookie对象
*
* @param document: (必需)保存Cookie的Document对象
* @param name : (必需)指定Cookie名的字符串
* @param hours : (可选)Cookie的生存时间
* @param path : (可选)Cookie的路径(可见范围)
* @param domain : (可选)Cookie的域
* @param secure : (可选)是否安全
*/
function Cookie(document, name, hours, path, domain, secure) {
// 该对象所有预定义的属性都以为"_"开头, 以和存储在Cookie中的属性值区分开
this._document = document;
this._name = name;
// Cookie的生存期
if(hours)
this._expiration = new Date(new Date()).getTime() + hours.60*60*1000;
else
this._expiration = null;
// Cookie的路径
if(path)
this._path = path;
else
this._path = null;
// Cookie的域
if(domain)
this._domain = domain;
else
this._domain = null;
// 安全性
if(secure)
this._secure = secure;
else
this._secure = null;
} /*
* 存储
*/
Cookie.prototype.store = function() {
// 首先遍历cookie对象的所有属性, 并将cookie值连接起来.
// 由于cookie将 '=' 和 ';' 作为分隔符,
// 所以我们使用 ':' 和 '&' 来分隔存储在单个cookie值中的状态变量.
// 注意,我们对每个状态变量的值进行了转义,以防它含有标点符号或其他非法字符.
var cookieVal = "";
for(var property in this) {
// 忽略所有名字以 '_' 开头的属性和所有方法
if((property.charAt(0)=='_') || (typeof this[property])=='function')
continue;
if(cookieVal != "")
cookieVal += '&';
cookieVal += property + ':' + escape(this.[property]);
}
} /*
*
*/
Cookie.prototype.load = function() {
// 首先得到属于该文档的所有cookie列表.
// 通过读Document.cookie属性可以实现这一点
var allCookies = this._document.cookie;
if(allCookies == "")
return false;
// 下面从该列表中提取已命名的cookie
var start = allCoolkies.indexOf(this._name + '=');
if(start == -1)
return false;
start += this._name.length + 1;
var end = allCookies.indexOf(';', start);
if(end == -1)
end = allCookies.length;
var cookieVal = allCookies.substring(start, end);
// 既然我们已经提取出了已命名的cookie的值,
// 就可以把它分割存储到状态变量名和值中.
// 名字/值对由 '&' 分隔, 名字和值之间则由 ':'分隔.
// 使用split()方法解析所有数据
var a = cookieVal.split('&'); // 分隔成名字/值对
for(var i=0; i<a.length; i++)
a[i] = a[i].split(':');
// 既然已经解析了cookie值,
// 就可以设置cookie对象中的状态变量的名字和值
// 注意我们对属性值调用了unescape()方法,因为存储它们时调用了escape()方法.
for(var i=0; i<a.length; i++)
this[a[i][0]] = unescape(a[i][1]);
return true;
} /*
*
*/
Cookie.prototype.remove = function() {
var cookie;
cookie = this._name + '=';
if(this._path)
cookie += '; path=' + this._path;
if(this._domain)
cookie += '; domain=' + this._domain;
cookie += '; expires=Fri, 02-Jan-1970 00:00:00 GMT';
this._domain.cookie = cookie;
}
四 Cookie应用