zoukankan      html  css  js  c++  java
  • cookie

    cookie:

    1.一旦关闭浏览器,cookie就会消失,cookie的作用域和sessionStorage的作用域不一样,不是局限在单个浏览器窗口中的,它的寿命是整个浏览器进程,而不是的单个浏览器进程

    2.cookie的作用域通过文档源和文档路径来确定的,

    默认情况下,cookie和创建它的web页面有关,并对该web页面以及和该web页面同目录或子目录的其他web页面可见

    在http://www.example.com/catalog/index.html页面下的cookie(该页面的目录是catalog,所以catalog目录下面的所有页面都是可以使用此页面创建的cookie)

    在http://www.example.com/catalog/order.html和

       http://www.example.com/catalog/widget/index.html在是可以使用的,

    但是在http://www.example.com/about.html下是不可见的(没有catalog目录存在)

    3.设置cookie的路径(path属性)可让URL以指定的路径前缀开始的页面,可以共享cookie

    例http://www.example.com/catalog/widget/index.html页面创建了一个cookie,且将path设置成'/catalog'(按照规则,原来的目录是widget,所以默认widget下面的所有页面可以共享,但是这里手动设置成了catalog,所以导致catalog目录下面的所有页面可以共享此页面创建的cookie),那么

    http://www.example.com/catalog/order.html也是可见的,如果设置成'/'那么对于http://www.exapmle.com这台WEB服务器上的页面都是可见的。

    4.cookie的作用域默认由文档源限制

    例如order.example.com域下的服务器想要读取catalog.example.com域下设置的cookie值,这时候需要将catalog.example.com域下创建的cookie的path=’、‘,domin=’.example.com‘,那么该cookie就对于其他任何example.com域下的任何服务器可见。

    5.cookie默认是以不安全的形似(通过普通的,不安全的HTTP连接)传递,一旦被标志为安全的,那就只能当浏览器和服务器通过HTTPS或者其他的安全协议连接时候才能传递

    保存cookie:

    name=value形式

    doucment.cookie="version="+encodeURIComponent(document.lastModified);

    由于cookie的名值对的值不允许包含分号,逗号和空白符,因此,在存储前一般要采用encodeURIComponent编码。读取时不要忘记解码decodeURIComponent

    设置cookie的其他属性要用

    name=value; max-age=seconds; path=path; domain=domian; secure

    注意不同名值对之间用分好空格分开,cookie返回的时候就是一个string,和保存的时候一个样儿,所以使用split将cookie中的名值对分离出来。

        //以名/值的形式存储cookie
        //同时采用encodeURLComponent()函数进行编码,来转义分号,逗号和空白符
        //如果daysToLive是一个数字,设置max-age属性为该数值表示cookie直到指定的天数
        //到了才会过期,如果dayToLive是0就表示删除cookie
        function setCookie(name,value,daysToLive){
            var cookie=name+"="+encodeURIComponent(value);
            if(typeof daysToLive === "number")
                cookie +=";max-age="+(daysToLive*60*60*24);
            document.cookie=cookie;
        }
    
        //读取cookie
        function getCookie(){
            var cookie={};//初始化最后要返回的对象
            var all=document.cookie;  //获取所有cookie
            if(all==="") return cookie; //如果获取的所有cookie为空,则返回空对象
            var list=all.split(";");   //分离出名/值对
            for(var i=0;i<list.length;i++){ //遍历每个cookie
                var percookie=list[i];
                var p=percookie.indexOf("="); //查找第一个“=”
                var name=percookie.substring(0,p); //获取cookie的名字
                var value=percookie.substring(p+1); //获取cookie的value
                value=decodeURIComponent(value); //对值解码
                cookie[name]=value;
            }
            return cookie;
        }
    
        /*cookieStorage.js
        * 本类实现像localStorage和sesseionStorage一样存储的API,不同的是,基于HTTP cookie实现它
        * */
    
        function cookieStorage (maxage,path){ //path作用域 maxage有效期
    
            //获取一个存储全部cookie信息的对象
            var cookie=(function(){
                var cookie={};
                var all=document.cookie;
                if(all === "") return cookie;
                var list = all.split(";");
                for(var i=0;i<list.length;i++){
                    var percookie=list[i];
                    var p=percookie.indexOf("="); //查找第一个“=”
                    var name=percookie.substring(0,p); //获取cookie的名字
                    var value=percookie.substring(p+1); //获取cookie的value
                    value=decodeURIComponent(value); //对值解码
                    cookie[name]=value;
                }
                return cookie;
            }());
    
            //将所有cookie的名字存储到一个数组
            var keys=[];
            for(var key in cookie)
                keys.push(key);
    
            //定义存储API公共的属性和方法
            //存储cookie的个数
            this.length=keys.length;
    
            //返回第n个cookie的名字,如果n越界则返回null
            this.key=function(n){
                if(n<0||n>=keys.length) return null;
                return keys[n];
            }
    
            //返回指定名字的cookie的值,如果不存在,返回null
            this.getItem=function(name){
                return cookie[name]||null;
            }
    
            //存储cookie
            this.setItem=function(key,value){
                if(!(key in cookie)){ //如果要存储的cookie不存在
                    keys.push(key);  //将指定名字加入到存储所有cookie名字的数组中
                    this.length++;
                }
    
                //将该名/值对数据存储到cookie对象中
                cookie[key]=value;
    
                //开始正式设置cookie
                //首先要将存储的cookie进行编码,同时创建一个“名字=编码后的值”形式的字符串
                var cookie=key+'='+encodeURIComponent(value);
    
                //将cookie的属性也急啊如到该字符串
                if(maxage) cookie+=";max-age="+maxage;
                if(path) cookie+=";path="+path;
    
                //通过document.cookie属性来设置cookie
                document.cookie=cookie;
            };
    
            //删除指定的cookie
            this.removeItem=function(key){
                if(!(key in cookie)) return;
    
                //从内部维护的cookie组删除指定的cookie
                delete cookie[key];
    
                //同时将cookie中的名字也在内部的数组中删除
                //如果使用ES5定义的数组indexOf()方法会更加简单
                for(var i= 0;i<keys.length;i++){
                    if(keys[i]===key){
                        keys.splice(i,1); //将它从数组中删除
                        break;
                    }
                }
                this.length--; //cookie个数减一
    
                //最终通过将该cookie值设置成空字符串以及将有效期设置成0来删除指定的cookie
                document.cookie=key+"=;max-age=0";
            };
    
            //删除所有cookie
            this.clear=function(){
                //循环所有的cookie的名字,并将cookie删除
                for(var i=0;i<keys.length;i++){
                    document.cookie=keys[i]+"=;max-age=0";
                }
                //重置所有的内部状态
                cookie={};
                keys=[];
                this.length=0;
            }
        }
  • 相关阅读:
    剑指offer——最小的K个数和数组中第K大的元素
    Leetcode刷题指南链接整理
    160. Intersection of Two Linked Lists
    100. Same Tree
    92. Reverse Linked List II
    94. Binary Tree Inorder Traversal
    79. Word Search
    78,90,Subsets,46,47,Permutations,39,40 DFS 大合集
    0x16 Tire之最大的异或对
    0x16 Tire
  • 原文地址:https://www.cnblogs.com/RachelChen/p/5435002.html
Copyright © 2011-2022 走看看