• 23-存储会话:cookie、WebStorage和indxDB


    存储会话的两种途径:Cookie和Web Storage。

    存储会话是什么意思呢?毕竟机器它们又不能真的讲话。所以,我就把存储会话理解为存储用户的信息,比如说用户名和密码,用户一旦输入过后,浏览器就能自己记住这些信息,不用再去记录了。

    一、将数据存储在客户端上——cookie

    该标准要求,服务器对请求发送Set-Cookie HTTP头,作为响应的一部分。

    Set-Cookie头包括name、value。名称和值在传送过程中是以URL编码的。

    1、限制

    2、cookie的构成

    名称:不区分大小写,经过url编码。

    值:字符串,经过url编码的。

    3、JS中的cookie

    一个接口和一个方法,document.cookie和decodeURIComponent()。

    该方法是解码用的。

    最好每次设置cookie时都要使用encodeURIComponent()编码。

    document.cookie=encodeURIComponent("name")+"="+encodeURIComponent("Alice");
    document.cookie=encodeURIComponent("name")+"="+encodeURIComponent("Tony")+";domain=.wrox.com";

    要给创建的cookie指定额外信息,就要将参数追加到这个字符串上。以分号加一个空格“; ”分割。

    JS对cookie的获取是通过document.cookie这个接口来取得的。写一个对象,里面包含各种方法可以简化cookie的读取、写入和删除。

    var CookieUtil={    
        //获取cookie
        get:function(name){
            //得到的是经过编码的值
            var cookieName=encodeURIComponent(name)+"=";
            var cookieStart=document.cookie.indexOf(cookieName);
            var cookieValue=null;
            if (cookieStart>-1){
                //cookie存在
                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
        set:function(name,value,expires,path,domain,secure){
            var cookieTxt=decodeURIComponent(name)+"="+decodeURIComponent(value);
            //过期时间
            if(expires instanceof Date){
                cookieTxt=cookieTxt+"; expires="+expires.toGMTString();
            }
            if(path){
                cookieTxt=`${cookieTxt}; path=${path}`;
            }
            if(domain){
                cookieTxt=`${cookieTxt}; domain=${domain}`;
            }
            if(secure){
                //secure非键值对,是一个secure的字符串
                cookieTxt=`${cookieTxt}; ${secure}`;
            }
            // console.log(cookieTxt);
            document.cookie=cookieTxt;
        },
    };

    有了上面的添加cookie和删除cookie的方法,就可以使用了。我写了这样一段代码:

    var date=new Date();
    CookieUtil.set("book","love U!",date);
    console.log('浏览器中的cookie',document.cookie);
    var getInfo=CookieUtil.get("book")
    console.log('获得cookie',getInfo);

    在node环境中运行,发现控制台给我报了一个错误:

    document is not defined

    为什么呢?document不是window的对象吗?js文件默认的对象是window,所以省略不写也没有问题啊?我不明白,于是在document前加了window,但还是同样的错误。于是找了网上的回答。

     

     渣英语翻译一下:document是一个浏览器的dom对象,而node.js只是一个服务器,并不是js的浏览器,因此你不能用它获取浏览器的dom。

    所以我就把这段代码复制到浏览器的控制台上,发现set成功了,第一个cookie是就是set后的结果,但是get还是get不到啊。

    然后我就发现是我最上面的那个代码写错了,decode是解码,encode是编码啊。我两个给弄混了。

    4、global对象的URI编码方法

    URI:Uniform Resource Identifiers,通用资源标识符。

    而encodeURI、decodeURI、encodeURIComponent、decodeURIComponent这四个方法,只是对URI进行编码,以便发送给浏览器。他们用特殊的UTF-8编码来替换所有无效的字符,从而让浏览器理解和接受。

    -

    为了理解encodeURI、decodeURI、encodeURIComponent、decodeURIComponent四个方法到底是什么,通过代码输出一下:

    var str1=encodeURI("happy");
    console.log(str1);//happy
    var str2=encodeURIComponent("sad");
    console.log(str2);//sad
    var str3=decodeURI("angry");
    console.log(str3);//angry
    var str4=decodeURIComponent("cry");
    console.log(str4);//cry
    
    console.log(encodeURIComponent("http://www.w3school.com.cn"))//http%3A%2F%2Fwww.w3school.com.cn
    console.log(encodeURIComponent("http://www.w3school.com.cn/p 1/"))//http%3A%2F%2Fwww.w3school.com.cn%2Fp%201%2F
    console.log(encodeURIComponent(",/?:@&=+$#"))//%2C%2F%3F%3A%40%26%3D%2B%24%23
    
    console.log(encodeURI("http://www.w3school.com.cn"))//http://www.w3school.com.cn
    console.log(encodeURI("http://www.w3school.com.cn/p 1/"))//http://www.w3school.com.cn/p%201/
    console.log(encodeURI(",/?:@&=+$#"))//,/?:@&=+$#

     先来看一下encodeURIComponent和encodeURI。

    encodeURI是不会对属于自己的URI特殊符号进行编码。例如冒号、正斜杠、问号和井字号。

    而encodeURIComponent是对整个地址中所有不符合规则的路径进行编码,即会对它发现的任何非标准字符进行编码。

    在cookie中,一般用encodeURIComponent进行编码。

    二、Web存储机制

    Web存储机制目的是:

    (1)为了克服cookie的限制,它的数据存在客户端上,不用发送给服务器。但浏览器关闭的时候,存储的信息就消失了。

    (2)提供一种存储大量可以跨会话存在的数据机制

    Web存储机制包括两种对象:sessionStorage和globalStorage。这两个对象在浏览器中是以window对象属性的形式存在的。

    还记得在事件对象里面,IE浏览器的事件event 是作为window的属性存在的。现在,浏览器的window属性又多了两个。

    Storage类型包含的方法有5种:

    (1)clear(): 删除所有值

    (2)getItem(name): 根据name获取对应的值。

    (3)setItem(name, value): 根据name设置对应的值。

    (4)removeItem(name): 删除name对应的值。

    (5)key(index):获得index位置处值的名字。

    sessionStorage是Storage的一个实例,所以可以使用Storage的各种方法,比如setItem方法。这些数据在浏览器关闭之后就会消失,但是跨页面刷新仍然存在。

    sessionStorage.setItem("name","Alice"); //使用方法来存值,建议用这种
    sessionStorage.book="如何学好JS";  //使用属性来存值,不建议使用

     2、globalStorage空间的访问

    他把信息存储在了电脑磁盘上。要想获取这些数据,必须先指定哪些域可以访问该数据。他是根据发起请求页面的域名、协议、端口来限制的。类似于ajax的同源策略。

    如果用户长期未清理浏览器缓存,存储在globlastorage属性中的数据会一直保留。

      

     3、localStorage

    localStorage取代了globalStorage,不需要给localStorage指定任何访问规则,规则早就设置好了。

    localStorage也是Storage的一个实例,也可以使用Storage的五种方法,就像sessionStorage一样。

    localStorage.setItem('name', 'Alice'); //使用方法进行存取值,建议使用
    localStorage.getItem('name');
    localStorage.age = 18; //使用属性进行存取值,不建议使用
    var age = localStorage.age;

    三、IndexDB

    indexDB是一个数据库,它的特点在于保存内容的时候,不是以表格的形式,而是以对象集合的形式。

    1、数据库

    使用indexDB的第一步,就是open()。如果数据库已存在,就会打开;如果不存在,就会创建并打开。

    indexDB.open()会返回一个IDBRequest对象。在这个对象上,使用onerror和onsuccess事件处理程序。

    var indexDB=window.indexedDB;
    function checkAll(){
        var database;
        var request=indexDB.open("admin");
        request.onerror=function(event){
            console.log(event.target.errorCode);
        };
        request.onsuccess=function(event){
            database=event.target.result;
        };
    }

    看上面这段代码,分析一下。

    首先打开的IDBRequest对象,赋给了request变量。而这个request变量,事件上就是事件中的属性target,所以,request其实就等于event.target。

    而request这个对象中,存在的result属性,是一个数据库的实例对象。我们把这个对象赋给了database变量。

    2、对象存储空间(增)

    有了数据库,就要往数据库里增加和删除信息了。

    在创建对象存储空间之前,首先要先清楚,你想要的保存什么数据类型。

    取对象里面的某一个属性,作为对象存储空间的键。这个属性必须全局唯一,而我们就是通过这个键来访问数据。他是必需项。

    var user={
        username:"007",    
        firstName:"Wang",
        lastName:"Huahua",
        password:"123"
    }
    var store=db.createObjectStore("users",{keypath:"username"});

    分析上面这段代码,假设我们要记录的一个对象格式,是user这样的格式。取user对象里面的username作为键,创建一个对象存储空间。

    createObjectStore里的第一个参数,是这个空间的名字,第二个参数,就是键了。

    使用add()和put()方法,用来向这个空间添加数据。

    var user1={
        username:"007",    
        firstName:"Wang",
        lastName:"Huahua",
        password:"123"
    },
    var user2={
        username:"007",    
        firstName:"Wang",
        lastName:"Huahua",
        password:"123"
    }
    var store=db.createObjectStore("users",{keypath:"username"});
    
    var users=[user1,user2]
    var i=0;
    while(i<users.length){
        store.add(users[i++]);
    }

    add与put的区别是:如果存在同名对象,add会报错,put会覆盖。

    3、事务(改、查)

    transaction()方法,创建事务。

  • 相关阅读:
    自定义异常
    finally关键字
    捕捉异常try-catch
    throws抛出异常
    exception概述和分类
    jvm前奏篇
    Java并发编程学习随笔 (一) 使用run() 和 start()的差别
    MyCat学习 ------分库分表 随笔
    java最常用的内置工具类
    Mybatis框架常见面试题
  • 原文地址:https://www.cnblogs.com/qingshanyici/p/10803302.html
Copyright © 2020-2023  润新知