数据存储之HTTP Cookie
Cookie (HTTP Cookie)
      作用
            HTTP本身是无状态的,客户端通过Cookie来存储会话信息
      限制
            cookie在性质上是绑定在特定域名下的 
                意思是说当设定了一个cookie之后,再给创建这个cookie的域名发送请求的时候,都会包含这个cookie,这个限制确保了存储在cookie中的信息只能让批准的接受者访问,而无法被其他域访问
            每个域名的cookie总数有限制  (name=value&age=18) 两个
                  IE7之后  最多50个
                  Firefox 最多50个
                  Opera   最多30个
                  Safari和 chrome 对每个域名的cookie数量没有限制
            cookie的尺寸有限制 大约4096B(加减1)的长度限制 建议cookie的长度限制在4095B以内 尺寸限制影响到一个域下的所有cookie,而非每个cookie单独限制
      组成 
            名称
                  一个唯一确定cookie的名称 不区分大小写 mycookie 和 myCookie是一个cookie 实践中最好区分大小写 名称要被URL编码
            值
                  存储cookie的字符串值 要被URL编码
            域
                  cookie对于哪个域名是有效的 所有向该域发送的请求中都会包含这个cookie的信息
                值
                      可以包含子域(subdomain 如www.wrox.com)
                      不包含子域 (如 .wrox.com 对于所有的子域都有限 可以做跨域信息存储)
                      默认 来自设置cookie的那个域
            路径
                  对于指定域中的路径应该向服务器发送cookie 例:可以指定cookie只可以从http://www.wrox.com/book/中访问,那么http://www.wrox.com的页面就不会发送cookie信息
      即便请求来自同一个域
            失效时间
                  表示cookie何时应该被删除的时间戳(也就是何时应该停止向服务器发送这个cookie)
                  默认情况下 浏览器会话结束时即将所有的cookie删除
                  时间格式 GMT (toGMTString())
                  如果设置的失效时间是当前时间以前 则cookie会被立刻删除
            安全标识
                  在字符串中指定 secure 即可 
                  指定后,只有使用SSL连接的时候才发送到服务器。例如cookie信息只能发送https://www.wrox.com 而 http://www.wrox.com的请求不能发送cookie
            注意:
                  cookie的名称 和 值 要经过 URL编码
                  域 路径 实效时间 secure标志都是服务器给浏览器的指示,以指定何时发送cookie 这些参数并不会发送到服务器的cookie信息的一部分,只有名值对才发送
            例子
                  注:这里说的set-Cookie是客户端设置的内容
                  set-Cookie: name=value;domain=.wrox.com; path=/; secure
                  这里创建了一个对于所有的wrox.com的子域和域名下(由path参数指定的)所有页面都有效的cookie 因为创建了 secure标志 这个cookie只能通过SSL连接才能传输
  JS中的cookie
            document.cookie 
                  返回当前页面可用的所有cookie(根据cookie的域 路径 失效时间 和安全设置)
                  document.cookie = "key=value" 不会覆盖之前的cookie 而是添加到cookie的字符串中 如果key相同 则覆盖
                  设置
                        name=value; expires=expiration_time; path=domian_path; secure
                        只有name和value是必要参数 其余为可选
                  例子
                        document.cookie = encodeURIComponent("name") + "=" + encodeURIComponent("value") +"; domain=".wrox.com; path=/; expires=" + new Date(); //new Date(0)设置为过期
IE 用户数据
       <div style="behavior:url(#default#userData)" id="dataStore"></div>
       var dataStore = document.getElementById("dataStore");
       dataStore.setAttribute("name", "lxk");
        dataStore.setAttribute("age", 22);
        dataStore.save("info")
  div元素上存了两部分信息 在setAttribute()存储之后 调用了save方法 指定了数据空间的名称为info 下一次页面载入的时候 使用load()方法指定同样的数据空间来获取数据 值不存在或者载入不存在的 返回为null
            dataStore.load("info");
            dataStore.getAttribute("name") --> lxk;
            dataStore.getAttribute("age")  --> 22
      可以调用removeAttribute("name")来删除 之后再调用save()方法保存即可    
延伸:
      不同子域之间通信问题
          可以通过设置 domain为.wrox.com 来让所有的子域可以拿到这个cookie
  HTTP 是一个网络协议 专门用来传输WEB的内容的
      SSL 
            Secure Sockets Layer 安全套接层 网景提出 
            为啥有SSL协议呢
                因为HTTP协议是明文的,存在很多缺点(传输内容会被窥探和修改)
  TLS 
            Transport Layer Security 传输层安全协议
            1999年,SSL 因为应用广泛,已经成为互联网上的事实标准。IETF 就在那年把 SSL 标准化 之后标准化的名字叫TLS 和SSL为同一个东西的不同阶段
  HTTPS
          HTTP + SSL/TLS
var CookieUtil = {
    /*
     *   思路
     *      字符串的截取(开始位置, 结束位置)
     *      开始位置 indexOf() + name.length
     *      结束位置 indexOf(";", 开始位置) 如果= -1 结束位置等于字符串的长度;
    **/
    get: function(name){
        var cookieName = encodeURIComponent(name) + "=",
            cookieStart = document.cookie.indexOf(cookieName),
            cookieValue = null;
            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;
    },
    set: function(name, value, expires, path, domain, secure){
        var 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;
    },
    unset: function(name, path, domain, secure){
        this.set(name, "", new Date(0), path, domain, secure);
    }
};
/*
 *  解析 cookie格式(subCookie)为  name=name1=value1&name2=value2&name3=value
 *
 *
**/
var SubCookieUtil = {
    get: function(name, subName){
        var subCookie = this.getAll(name);
        if(subCookie){
            return subCookie[subName];
        }else{
            return null;
        }
    },
    getAll: function(name){
        var cookieName = encodeURIComponent(name) + "=",
            cookieStart = document.cookie.indexOf(cookieName),
            cookieValue = null,
            cookieEnd,
            subCookies,
            i,
            parts,
            result = {};
        if(cookieStart > -1){
            cookieEnd = document.cookie.indexOf(";", cookieStart);
            if(cookieEnd == -1){
                cookieEnd = document.cookie.length;
            }
            cookieValue = 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;
    },
    set: function(name, subName, value, expires, path, domain, secure){
        var subcookies = this.getAll(name) || {};
        subcookies[subName] = value;
        this.setAll(name, subcookies, expires, path, domain, secure)
    },
    /*
     *      setALl("data", {name:"Nicholas", age: 22}, new Date("January 2 2020"))
     *.
    **/
    setAll: function(name, subcookies, expires, path, domain, secure){
        var cookieText = encodeURIComponent(name) + "=",
            subCookieParts = new Array(),
            subName;
        for(subName in subcookies){
            if(subName.length > 0 && subcookies.hasOwnProperty(subName)){
                subCookieParts.push(encodeURIComponent(subName) + "=" + encodeURIComponent(subcookies[subName]))
            }
        }
        if(subCookieParts.length > 0){
            cookieText += subCookieParts.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=" + (new Date(0)).toGMTString();
        }
        document.cookie = cookieText;
    },
    unset: function(name, subName, path, domain, secure){
        var subcookies = this.getAll(name);
        if(subcookies){
            delete subcookies[subName];
            this.setAll(name, subcookies, null, path, domain, secure)
        }
    },
    unsetAll: function(name, path, domain, secure){
        this.setAll(name, null, new Date(0), path, domain, secure)
    }
}
数据存储之HTTP Cookie的更多相关文章
- 浏览器本地数据存储解决方案以及cookie的坑
		
本地数据存储解决方案以及cookie的坑 问题: cookie过长导致页面打开失败 背景: 在公司的项目中有一个需求是打开多个工单即在同一个页面中打开了多个tab(iframe),但是需要在刷新时只刷 ...
 - 本地数据存储解决方案以及cookie的坑
		
本地数据存储解决方案以及cookie的坑 问题: cookie过长导致页面打开失败 背景: 在公司的项目中有一个需求是打开多个工单即在同一个页面中打开了多个tab(iframe),但是需要在刷新时只刷 ...
 - Web客户端数据存储学习笔记——Cookie
		
今天对登录访问的安全以及web客户端存储做了一些大致的学习,决定在这方面加深理解,记录在博客里.第一个接触到的是Cookie... WHAT? WHY? HOW? 在学习cookie的使用时发现其名称 ...
 - 23. javacript高级程序设计-数据存储
		
1. 数据存储 1.1 cookie HTTP Cookie, cookie,最初用来在客户端存储回话信息. (1). 限制,不同浏览器对特定域名下的cookie 的个数有限制,每个域名下最好不要操过 ...
 - 前端数据存储方案集合(cookie localStorage等)以及详解 (二)
		
前端数据存储方案集合(cookie localStorage等)以及详解 (二) 在之前的文章中已经介绍到了 前端存储方案中的 cookie . 但是 cookie 的存储上限是 4KB. 如果超过了 ...
 - 数据存储的两种方式:Cookie 和Web Storage
		
数据存储的两种方式:Cookie 和Web Storage 1.Cookie Cookie的作用就像你去超市购物时,第一次给你办张购物卡,这个购物卡里存放了一些你的个人信息,下次你再来这个连锁超市时, ...
 - JavaScript高级编程———数据存储(cookie、WebStorage)
		
JavaScript高级编程———数据存储(cookie.WebStorage) <script> /*Cookie 读写删 CookieUtil.get()方法根据cookie的名称获取 ...
 - 数据存储的两种方式:Cookie 和Web Storage(转)
		
数据存储的两种方式:Cookie 和Web Storage 数据存储的两种方式:Cookie 和Web Storage 1.Cookie Cookie的作用就像你去超市购物时,第一次给你办张购物卡 ...
 - 客户端数据存储cookie、localStoeage、sessionStorage(小记)
		
一.数据存储分为客户端存储和服务端存储 1.而对于客户端存储,在html5以前只能通过cookie来实现:html 5以后增加了web存储(实际保存本地)的功能 (1)对于web存储有两个标准: ...
 
随机推荐
- SpringCloud学习笔记(7)——Sleuth
			
Part VII. Spring Cloud Sleuth 46. Introduction Spring Cloud Sleuth为Spring Cloud实现了分布式的跟踪解决方案 46.1 Te ...
 - 用mint ui去实现滚动选择日期并可以关闭拾取器
			
转发要备注出处哈,么么哒 注释的那些部分都是我在尝试的时候写得,留给自己看得,删除不影响效果哈,希望对你们有帮助,比较忙可能写得很粗糙,不好意思,有空再改了 实例一: <template&g ...
 - windbg蓝屏调试
			
一般在写Windows内核程序的时候,经常会出现蓝屏的问题,这个时候一般是采用记录下dump文件然后用windbg查看得方式,具体的过程就不说了,网上一大堆的内容.现在我主要记录自己当初按照网上的方案 ...
 - .net 下发送calendar
			
前段时间公司系统中有一块需要发送邮件calendar outlook可以接受查看calendar 发送outlook主要是有rrule脚本的边界 网上找过一些资料,主要有两种实现方式 1.一种是已ic ...
 - Mycat 配置
			
前言 Mycat 是一个数据库分库分表中间件 MyCAT 是作为通用代理设计的,后端是以 Mysql协议 和 JDBC 的方式连接数据库,可以支持 Oracle.DB2.SQL Server . mo ...
 - 同时安装python2和python3
			
Windows 10 上已经安装了Anaconda2 和 python2.7 [工作需要] 想安装Anaconda3 和 python3 [学习需要] 以 Anaconda2 为主,3为辅. 要点: ...
 - Codeforces 893F - Subtree Minimum Query
			
893F - Subtree Minimum Query 题意 给出一棵树,每次询问 \(x\) \(k\),求以 \(x\) 为根结点的子树中的结点到结点 \(x\) 的距离小于等于 \(k\) 的 ...
 - Zabbix实战-简易教程(9)--触发器函数(triggers)
			
Zabbix触发器函数学习 本文主要讲述zabbix触发器函数. 1.abschange 参数:缺省 值类型:float, int, str, text, log 返回值解析: Returns abs ...
 - linux(八)linux系统中查找文件二
			
前面介绍的是find命令,我们发现一个find命令居然有那么多的命令,我看到都要晕了,不管没有关系,加油.相信自己! 一.grep命令 1.1.作用 Linux系统中grep命令是一种强大的文本搜索工 ...
 - HDU 1003 Max Sum【动态规划求最大子序列和详解 】
			
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...