cookie和session有很多相似的作用,session主要用于服务器端用来保存会话,同时也是基于cookie来实现的。本文主要是谈下对cookie的使用。
cookie是document下面的一个属性,所有操作cookie是通过document.cookie。
一、cookie的简单操作(增删改查)
1、写入一个cookie
cookie是key,value的形式存在本地磁盘或者内存中的。
// cookie写入一个key为userId,value为828的值
document.cookie="userId=828";
// cookie写入多个值可以使用分号加空格(; )隔开
document.cookie="userId=828; userName=hulk";
在cookie 的名或值中不能使用分号(;)、逗号(,)、等号(=)以及空格。在cookie的名中做到这点很容易,但要保存的值是不确定的。如何来存储这些值呢?方法是用escape()函数进行编码,它能将一些特殊符号使用十六进制表示,例如空格将会编码为“20%”,从而可以存储于cookie值中,而且使用此种方案还可以避免中文乱码的出现。当然取出来的时候需要使用unescape()进行解码才能得到原来的cookie值。
// escape
document.cookie="str="+escape("I love ajax");
// unescape
2、查询一个cookie
// 将所有的cookie都查询出来
var strCookie = document.cookie;
3、修改一个cookie
修改一个cookie直接写入一个key相同value不同的值即可
// 先写入一个cookie
document.cookie="userId=828";
// 修改一个cookie
document.cookie="userId=888";
4、删除cookie
为cookie设置一个过去的时间作为过期时间可以删除cookie
//获取当前时间
var date=new Date();
//将date设置为过去的时间
date.setTime(date.getTime()-10000);
//将userId这个cookie删除
document.cookie="userId=828; expires="+date.toGMTString();
简单的封装方法
// 添加一个cookie:addCookie(name,value,expiresHours)
// 该函数接收3个参数:cookie名称,cookie值,以及在多少小时后过期。这里约定expiresHours为0时不设定过期时间,即当浏览器关闭时cookie自动消失。该函数实现如下:
function addCookie(name,value,expiresHours){
var cookieString=name+"="+escape(value);
//判断是否设置过期时间
if(expiresHours>0){
var date=new Date();
date.setTime(date.getTime+expiresHours*3600*1000);
cookieString=cookieString+"; expires="+date.toGMTString();
}
document.cookie=cookieString;
}
// 获取指定名称的cookie值:getCookie(name)
// 该函数返回名称为name的cookie值,如果不存在则返回空,其实现如下:
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 "";
}
// 删除指定名称的cookie:deleteCookie(name)
function deleteCookie(name){
var date=new Date();
date.setTime(date.getTime()-10000);
document.cookie=name+"=v; expires="+date.toGMTString();
}
二、cookie的属性
一个完整的cookie有以下几个属性:key,value,expires,path,domain。key和value不用多解释。
expires:过期时间,当不设置过期时间时,cookie会存在内存中,当会话消失即浏览器关闭时cookie是消失。设置了过期时间,cookie会存放在本地磁盘中。
max-age:cookie的失效间隔(秒),优先级高于expires
document.cookie = "name=hezebing;max-age=60";更改或新增cookie,并设置1分钟的有效期
domain:域,不设置域的时候,cookie取值只能在文档对应的域名下可以取到,其他的域下取不到该cookie,例如www.google.com和gmail.google.com就是两个不同的主机名一个主机中创建的cookie在另一个主机下是不能被访问的。如果设置了domain属性就可以实现跨域访问。
// 所有google.com下的主机都可以访问该cookie。
document.cookie="name=value;domain=.google.com";
注意:顶级域名相同才可以通过设置domain实现跨域访问。
path:可访问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,语法如下:
// 其中cookieDir表示可访问cookie的目录
document.cookie="name=value; path=cookieDir";
// 就表示当前cookie仅能在shop目录下使用。
document.cookie="userId=320; path=/shop";
// 如果要使cookie在整个网站下可用,可以将cookie_dir指定为根目录
document.cookie="userId=320; path=/";
三、cookie的应用场景以及缺陷
应用:
(1)保存用户登录状态,跟踪用户的行为
缺陷:
(1)cookie可能被禁用。当用户非常注重个人隐私保护时,他很可能禁用浏览器的cookie功能;
(2)cookie是与浏览器相关的。这意味着即使访问的是同一个页面,不同浏览器之间所保存的cookie也是不能互相访问的;
(3)cookie可能被删除。因为每个cookie都是硬盘上的一个文件,因此很有可能被用户删除;
(4)cookie安全性不够高。所有的cookie都是以纯文本的形式记录于文件中,因此如果要保存用户名密码等信息时,最好事先经过加密处理。