JavaScript数据存储 Cookie篇


Posted in Javascript onJuly 02, 2016

1.什么是cookie?
    答:cookie是用于在客户端存储会话信息的。
2.cookie的组成部分?
    ①名称:一个唯一确定cookie 的名称。建议区分大小写。cookie 的名称必须是经过URL 编码的。
    ②值:储存在cookie 中的字符串值。值必须被URL 编码。
    ③域:cookie 对于哪个域是有效的。所有向该域发送的请求中都会包含这个cookie 信息。这个值可以包含子域(subdomain,如www.wrox.com),也可以不包含它(如.wrox.com,则对于wrox.com的所有子域都有效)。如果没有明确设定,那么这个域会被认作来自设置cookie 的那个域。
    ④路径:对于指定域中的那个路径,应该向服务器发送cookie。例如,你可以指定cookie 只有从http://www.wrox.com/books/ 中才能访问,那么http://www.wrox.com 的页面就不会发送cookie 信息,即使请求都是来自同一个域的。
    ⑤失效时间:表示cookie 何时应该被删除的时间戳。默认情况下,浏览器会话结束时即将所有cookie 删除;不过也可以自己设置删除时间。这个值是个GMT 格式的日期(Wdy, DD-Mon-YYYY HH:MM:SS GMT),用于指定应该删除cookie 的准确时间。因此,cookie
    可在浏览器关闭后依然保存在用户的机器上。如果你设置的失效日期是个以前的时间,则cookie 会被立刻删除。
    ⑥安全标志:指定后,cookie 只有在使用SSL 连接的时候才发送到服务器。例如,cookie 信息只能发送给https://www.wrox.com,而http://www.wrox.com 的请求则不能发送cookie。
3.列举一个cookie的例子?
    以下是一个完整的cookie的例子,我们将把它分解开来:
    Set-Cookie: name=value; expires=Mon, 22-Jan-07 07:10:24 GMT; domain=.wrox.com; path=/; secure
    ①名称: name字符串表示
    ②值:value字符串表示
    ③过期时间:Mon, 22-Jan-07 07:10:24 GMT
    ④域名:.wrox.com
    ⑤路径:当前目录/
    ⑥安全标志:secure
4.如何操作cookie?
 

var CookieUtil = {
    // 设置cookie
    set : function (name, value, expires, domain, path, secure) {
      var cookieText = "";
      cookieText += encodeURIComponent(name) + "=" + encodeURIComponent(value);
      if (expires instanceof Date) {
        cookieText += "; expires=" + expires.toGMTString();
      }
      if (path) {
        cookieText += "; path=" + path;
      }
      if (domain) {
        cookieText += "; domain=" + domain;
      }
      if (secure) {
        cookieText += "; secure";
      }
      document.cookie = cookieText;
    },
    // name=value; expires=expiration_time; path=domain_path; domain=domain_name; secure
    // 获取cookie
    get : function (name) {
      var cookieName = encodeURIComponent(name) + "=",
        cookieStart = document.cookie.indexOf(cookieName),
        cookieValue = "";
      if (cookieStart > -1) {
        var cookieEnd = document.cookie.indexOf (";", cookieStart);
        if (cookieEnd == -1) {
          cookieEnd = document.cookie.length;
        }
        cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd));
      }
      return cookieValue; 
    },
    // 删除cookie
    unset : function (name, domain, path, secure) {
      this.set(name, "", Date(0), domain, path, secure);
    }
  };
  // 测试
  CookieUtil.set("name", "zhang");
  var name = CookieUtil.get("name");
  alert(name);  // zhang
  CookieUtil.unset("name");
  alert(CookieUtil.get("name")); // 空

5.cookie的限制
    ①存储数据数量有限
    ②保了储存在cookie 中的信息只能让批准的接受者访问,而无法被其他域访问
    ③安全性有限
6.针对cookie数据存储少量的问题,我们提出了子cookie的概念。即在每条cookie的值中存储多条数据,用"&"隔开。

var SubCookieUtil = {
    /** 设置一条完整的cookie
    *  param name : 表示cookie的名称,必填
    *  param subCookies : 表示cookie的值,为一个对象,必填
    *  param expires : 表示cookie的过期时间,可以不填
    *  param domain : 表示cookie的域名,可以不填
    *  param path : 表示cookie的路径,可以不填
    *  param secure : 表示cookie的安全标志,可以不填
    *  eg : SubCookieUtil.setAll("info", { name : "zhang", age : 23});
    **/
    setAll : function (name, subCookies, expires, domain, path, secure) {
      var cookieText = "", subName, cookieParts = [];
      cookieText += encodeURIComponent(name) + "=";
      for(subName in subCookies) {
        cookieParts.push(encodeURIComponent(subName) + "=" + encodeURIComponent(subCookies[subName]));
      }
      if (cookieParts.length > 0) {
        cookieText += cookieParts.join("&");
        if (expires instanceof Date) {
          cookieText += "; expires=" + expires.toGMTString();
        }
        if (path) {
          cookieText += "; path=" + path;
        }
        if (domain) {
          cookieText += "; domain=" + domain;
        }
        if (secure) {
          cookieText += "; secure";
        }
      } else {
        cookieText += "; expires=" + Date(0).toGMTString();
      }
      document.cookie = cookieText;
    },
    /** 设置一条子cookie
    *  param name : 表示cookie的名称,必填
    *  param subName : 表示子cookie的名称,必填
    *  param value : 表示子cookie的值,必填
    *  param expires : 表示cookie的过期时间,可以不填
    *  param domain : 表示cookie的域名,可以不填
    *  param path : 表示cookie的路径,可以不填
    *  param secure : 表示cookie的安全标志,可以不填
    *  eg : SubCookieUtil.set("info", "sex", "boy");
    **/
    set : function (name, subName, value, expires, domain, path, secure) {
      var cookies = this.getAll(name) || {};
      cookies[subName] = value;
      this.setAll(name, cookies, expires, domain, path, secure);
    },
    /** 读取一条完整cookie
    *  param name : 表示cookie的名称,必填
    *  return : 一个cookie对象
    *  eg : SubCookieUtil.getAll("info");
    **/
    getAll : function (name) {
      var cookieName = encodeURIComponent(name) + "=",
        cookieStart = document.cookie.indexOf(cookieName),
        cookieValue = "", i, len, subCookies, parts, result = {};
      if (cookieStart > -1) {
        var cookieEnd = document.cookie.indexOf (";", cookieStart);
        if (cookieEnd == -1) {
          cookieEnd = document.cookie.length;
        }
        cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd));
        if (cookieValue.length > 0) {
          subCookies = cookieValue.split("&");
          for (i = 0, len = subCookies.length; i < len; i++) {
            parts = subCookies[i].split("=");
            result[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
          }
          return result;
        }
      }
      return null;
    },
    /** 获取一条子cookie的值
    *  param name : 表示cookie的名称,必填
    *  param subName : 表示子cookie的名称
    *  return : 一个子cookie的值
    *  eg : SubCookieUtil.get("info", "name");
    **/
    get : function (name, subName) {
      var cookies = this.getAll(name);
      if (cookies) {
        return cookies[subName];
      } else {
        return null;
      }
    }, 
    /** 删除一条完整cookie
    *  param name : 表示cookie的名称,必填
    *  param domain : 表示cookie的域名,可以不填
    *  param path : 表示cookie的路径,可以不填
    *  param secure : 表示cookie的安全标志,可以不填
    *  eg : SubCookieUtil.unsetAll("info");
    **/
    unsetAll : function (name, domain, path, secure) {
      this.setAll(name, "", Date(0).toGMTString(), domain, path, secure);
    },
    /** 删除一条子cookie
    *  param name : 表示cookie的名称,必填
    *  param subName : 表示子cookie的名称,必填
    *  param domain : 表示cookie的域名,可以不填
    *  param path : 表示cookie的路径,可以不填
    *  param secure : 表示cookie的安全标志,可以不填
    *  eg : SubCookieUtil.unset("info", "name");
    **/
    unset : function (name, subName, domain, path, secure) {
      var cookies = this.getAll(name);
      if (cookies) {
        delete cookies[subName];
        this.setAll(name, cookies, null, domain, path, secure);
      }
    }  
  };
  // 测试:
  var zhang = {
    name : "zhang",
    age : 23,
    height : "178cm",
    weight : "66kg"
  }
  // 设置一条完整的cookie
  SubCookieUtil.setAll("zhang", zhang);
  // 获取一条完整的cookie
  var zhang = SubCookieUtil.getAll("zhang");
  alert(zhang.weight);  // 66kg
  // 再为张添加一个子cookie
  SubCookieUtil.set("zhang", "sport", "basketball");
  // 获取子cookie
  alert(SubCookieUtil.get("zhang", "sport")); // basketball
  // 删除一条子cookie
  SubCookieUtil.unset("zhang", "age");
  alert(SubCookieUtil.get("zhang", "age"));  // undefined
  // 删除一条完整的cookie
  SubCookieUtil.unsetAll("zhang");
  alert(SubCookieUtil.getAll("zhang"));  // 报错,因为已经被删除

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
自适应图片大小的弹出窗口
Jul 27 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
Apr 01 Javascript
javascript 通用简单的table选项卡实现
May 07 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
May 19 Javascript
jQuery实现为图片添加镜头放大效果的方法
Jun 25 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
Dec 15 Javascript
浅谈angularjs module返回对象的坑(推荐)
Oct 21 Javascript
使用nvm管理不同版本的node与npm的方法
Oct 31 Javascript
vue轮播图插件vue-awesome-swiper
Nov 27 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
Jul 18 Javascript
layui表格内容溢出的解决方法
Sep 06 Javascript
微信小程序实现电子签名功能
Jul 29 Javascript
JavaScript实现简单的拖动效果
Jul 02 #Javascript
jQuery插件简单学习实例教程
Jul 01 #Javascript
jquery插件autocomplete用法示例
Jul 01 #Javascript
AngularJS 避繁就简的路由
Jul 01 #Javascript
AngularJS使用指令增强标准表单元素功能
Jul 01 #Javascript
AngularJS实现分页显示数据库信息
Jul 01 #Javascript
AngularJS内建服务$location及其功能详解
Jul 01 #Javascript
You might like
PHP url 加密解密函数代码
2011/08/26 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
php网站判断用户是否是手机访问的方法
2013/11/01 PHP
Ubuntu 16.04下安装PHP 7过程详解
2017/03/28 PHP
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
JS焦点图切换,上下翻转
2011/05/12 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
Javascript日期格式化format函数的使用方法
2016/08/30 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
JS实现碰撞检测的方法分析
2018/01/19 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
vue实现分页栏效果
2019/06/28 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
python实现清屏的方法
2015/04/30 Python
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
tensorflow转换ckpt为savermodel模型的实现
2020/05/25 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
2020/12/27 Python
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
办公室驾驶员岗位职责
2013/11/15 职场文书
《唯一的听众》教学反思
2014/02/20 职场文书
门前三包责任书
2014/04/15 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
SQL Server数据库的三种创建方法汇总
2023/05/08 MySQL