引用地址:http://www.imkevinyang.com/2009/06/javascript%E6%93%8D%E7%BA%B5cookie.html

在讲如何使用Javascript操纵Cookie时,我们先来了解一下Cookie的基本常识。

Cookie,又称Http Cookie,是存储在客户端本地的一小段信息。我们可以简单地把Cookie理解为客户端浏览器上的一个小硬盘,我们会在上面存取一些信息,通常用作Http状态的维护,现在也经常被用作跟踪用户行为的一种常见方式。

Session cookies - these are temporary and are erased when you close your browser at the end of your surfing session. The next time you visit that particular site it will not recognise you and will treat you as a completely new visitor as there is nothing in your browser to let the site know that you have visited before。

Persistent cookies - these remain on your hard drive until you erase them or they expire. How long a cookie remains on your browser depends on how long the visited website has programmed the cookie to last。

Cookie的属性

每一个Cookie都有如下几个属性:

  • 名称
  • 主机域
  • 路径
  • 安全级别
  • 过期时间

其中“名称”、“主机域”,“路径”三者一起唯一标识了一个Cookie。 
大多数Cookie在设置的时候都只是显式的设置了Cookie的名称和值,这种情况下,浏览器会自动的使用location.host来设置Cookie的主机域,将路径设置到根目录“/”下。例如,当你在www.example.com上面使用document.cookie="name=value"设置了一个Cookie,那么这个Cookie就拥有了如下属性:

  • 名称 —— name
  • 值 —— value
  • 主机域 —— www.example.com
  • 路径 —— /
  • 安全级别 —— No
  • 过期时间 —— 浏览器会话结束(关闭浏览器)

第一方和第三方Cookie的区别

第一方Cookie指的是设置在当前网站域上面的Cookie,而第三方Cookie指的是设置在其他域上的Cookie。

第一方Cookie比较好理解,我们通常遇到的都是属于第一方Cookie。在客户端Javascript中,我们只能操纵第一方Cookie,也就是说,我们不能在www.example.com主机上,设置www.google.cn的Cookie,这样就乱套了。

第三方Cookie不容易让人注意到。假设我们在公司网站www.example.com上面使用了map.google.com的地图服务,而Google地图在使用时又希望在用户这边设置一些Cookie,就跟用户直接访问自家网站(map.google.com)一样,如Session信息等,那么它会在返回的HTTP Response中包含set-cookie的报头,但由于是第三方域,存在安全问题,所以必须还在响应中包含一个P3P的主机头(P3P头中存的是隐私策略的摘要)来实现Cookie的第三方存取(注意,此时Cookie还是设置在b.com上面的)。IE中可以设置对第三方Cookie存取的限制。

Javascript操纵Cookie

在客户端使用Javascript操纵Cookie存在很多的不便之处,例如在读取Cookie的时候,只能通过手动解析document.cookie字符串得到指定cookie的值,不能得到其他任何信息,如设置的主机,路径以及过期时间等。

/**
 * 查询指定名称的Cookie值
 * @note 需要注意有可能出现同名cookie的问题
 * @param {Object} key
 * @param {Object} 设置当读取不到key时返回的默认值
 * @return {String} 返回读取到的Cookie的值,
 * 如果读取不到相应的Cookie,则判断defValue是否有效,有效则返回defValue,否则返回null
 */
function getCookie(key,defValue){
    var cookie,value;
    if(!key){
        return null;
    }
     
    cookie = document.cookie;
    // 所有cookie的key都小写化处理
    key = key.toLowerCase();
     
    value = find(cookie,key+"=",";",null,false,null);
    return value === null ? defValue : unescape(value);
}
/**
 * 设置cookie
 * @param {String} key
 * @param {String} value
 * @param {Number} expires 单位为秒
 * @param {String} path 路径
 * @param {String} domain 主机
 * @param {Boolean} secure 安全级别
 */
function setCookie(key, value, expires, path,domain,secure){
    // key无效则不做任何操作
    if(!key){
        return;
    }
     
    // 所有cookie的key都小写化处理
    key = key.toLowerCase();
     
    key = key + '=' + escape(value) + ";";
    expires = expires ? ("expires=" + new Date(new Date().getTime() + expires * 1000).toGMTString()) + ";" : "";
    path = !!path ? "path=" + path + ";" : "path=/;";
    domain = domain ? ("domain=" + domain) + ";" : "";
    secure = secure ? "secure=true;" : "";
    document.cookie =[key,expires,path,domain,secure].join("");
}
/**
 * 删除指定Cookie
 * @param {Object} key
 * @param {Object} path
 * @param {Object} domain
 */
function delCookie(key,path,domain){
    // 超时设置为过去的时间,cookie会立即失效
    key = key.toLowerCase();
    setCookie(key,"",-1000,path,domain);   
}
/**
 * 从字符串中获取夹在指定前缀和后缀之间的值
 * @example
 * userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.2) Gecko/2008082714 Firefox/3.0.2"
 *
 * prefix="windows nt"
 * suffix=";"
 * find(userAgent,prefix,suffix) returns " 5.2";
 * @param {Object} str 源字符串
 * @param {Object} prefix 前缀
 * @param {Object} suffix 结束符,若不指定,则匹配到字符串结尾;如果指定了,但是匹配不到,则同样匹配到字符串结尾。
 * @param {Boolean} matchFirstOnly 是否找到第一个匹配项,设置为false则查找最后一个匹配项,默认为false
 * @param {Boolean} ignoreCase     忽略大小写来查找,默认值为true
 * @param {Boolean} trimBlank 是否删除值首尾的空白符,默认值为true
 * @return {String} 查找到的字符串,若找不到则返回null
 */
function find(str,prefix,suffix,matchFirstOnly,ignoreCase,trimBlank){
    var start,end,middle,value=null;
    matchFirstOnly = (matchFirstOnly === true);
    ignoreCase = (ignoreCase !== false);
    trimBlank = (trimBlank !== false);
    // 如果忽略默认值
    if(ignoreCase){
        str = str.toLowerCase();
        prefix = prefix.toLowerCase();
        suffix = suffix && suffix.toLowerCase();
    }
     
    if(matchFirstOnly){
        start = str.indexOf(prefix);
    }else{
        start = str.lastIndexOf(prefix);
    }       
    if (start > -1) {
        // 如果没有指定后缀,则直接匹配到字符串结尾
        middle = start + prefix.length;
        if (!suffix) {
            value = str.substring(middle);
        }
        else {
            end = str.indexOf(suffix, middle);
            if (end > -1) {
                value = str.substring(middle, end);
            }
            else {
                value = str.substring(middle);
            }
        }
        if(trimBlank){
            value = value.replace(/^\s*(.*?)\s*$/, '$1');
        }   
    }
     
    return value;
}

Javascript操纵Cookie--转的更多相关文章

  1. js操纵cookie技术

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  2. JavaScript 操作 Cookie

    转自作者:聂微东出处:http://www.cnblogs.com/Darren_code/      什么是 Cookie “cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器 ...

  3. JavaScript操作Cookie

    在Web开发中,我们经常使用Cookie保存一些不是非常敏高的数据.比如“下次自动登录”,“广告显示”等功能.定义是:某些网站为了辨别用户身份而存储在用户本地终端(主要是浏览器)上的数据.定义域RFC ...

  4. javascript控制cookie

    参考:http://www.cnblogs.com/ly312/archive/2010/07/14/1777190.html function getCookies(name) { var arr ...

  5. JavaScript中Cookie的用法

    Javascript中Cookie主要存储于客户端的计算机中,用于存放已访问的站点信息,Cookie最大约为4k.以下实例主要用于页面在刷新时保存数据,具体的用法如下所示: <html> ...

  6. JavaScript之Cookie讲解

    什么是 Cookie “cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScript 来创建和取回 cookie ...

  7. javascript笔记——cookie解析

    JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...

  8. Cookie介绍及JavaScript操作Cookie方法详解

    本文主要为大家简单介绍了以下Cookie的用途.运行机制,以及JavaScript操作Cookie的各种方法,总结的比较全面,希望能给大家带来帮助. 什么是 Cookie “cookie 是存储于访问 ...

  9. JavaScript之cookie

    JavaScript通过Cookie实现简单的用户登录状态的保存.Cookie可以跨越多个网页使用,但不能跨域名使用,也不同跨浏览器使用. 1.设置cookie function SetCookie( ...

随机推荐

  1. 远程连接mongodb出现 no route to host 和 Connection refused

    部署好mongodb服务器后,在客户端安装好php的mongodb扩展,用程序连接mongodb服务器出错:no route to host.搜索了差不多一天的时候都没有相关的解决方法.最后在mong ...

  2. For Microsoft Azure Network VNET to VNET Connection

    将一个 Azure 虚拟网络 (VNet) 连接到另一个 Azure 虚拟网络非常类似于将虚拟网络连接到本地站点位置.这两种连接类型都使用虚拟网络网关通过 IPsec/IKE 提供安全隧道.连接的 V ...

  3. 自建存储与使用微软Azure、七牛等第三方云存储综合考察分析

    http://www.cnblogs.com/sennly/p/4136734.html 各种云服务这两年炒的火热,加之可以降低成本,公司想先在部分业务上尝试使用下,刚好最近有个项目有大量小文件需要存 ...

  4. C++11用于元编程的类别属性

    [C++11用于元编程的类别属性] 许多算法能作用在不同的数据类别; C++ 模板支持泛型,这使得代码能更紧凑和有用.然而,算法经常会需要目前作用的数据类别的信息.这种信息可以通过类别属性 (type ...

  5. uva 542 - France '98(概率)

    题目链接:uva 542 - France '98 题目大意:有16支球队比赛,给出16支球队的名称,然后给出16*16的表格,g[i][j] 表示i队胜j队的概率,问说16支球队获得总冠军的概率. ...

  6. C#下利用高精度计时器进行计时操作

    简介 精确的时间计量方法在某些应用程序中是非常重要的.常用的 Windows API 方法 GetTickCount() 返回系统启动后经过的毫秒数.另一方面,GetTickCount() 函数仅有 ...

  7. hdoj 5358 First One

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5358 一开始一直以为是一道数学题,在找有什么规律化简Log2(S(i,j)),结束了以后才造  ⌊lo ...

  8. Objc基础学习记录3

    在学习Objective-c中, 数组 1.NSArray, 这是一个不可变的数组,不能修改和删除其中的对象,可以存储任意objective的对象指针. 不能存储int,char类型的,,需要转换为需 ...

  9. 在XAF(ASP.NET)中以ListEditor的形式调用百度地图API

    因为项目需要,在系统中使用地图显示设备的地理位置.考虑过ArgGIS,Bing和Baidu地图.本来想用ArgGIS,看教程嫌麻烦.所以还是用Web地图吧.Bing的话还要申请个key,没心情.百度地 ...

  10. 关于Excel导入的HDR=YES; IMEX=1详解

    于Excel导入的HDR=YES; IMEX=1详解2011年12月27日 星期二 11:17 参数HDR的值:HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不 ...