一 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应用