美文网首页
sessionStorage、localStorage 、coo

sessionStorage、localStorage 、coo

作者: 何大必 | 来源:发表于2019-03-12 22:19 被阅读0次

    HTML5提供了两种本地存储的方式 sessionStorage 和 localStorage

    sessionStorage

    sessionStorage 属性允许你访问一个 session Storage 对象。它与 localStorage 相似,不同之处在于 localStorage 里面存储的数据没有过期时间设置,而存储在 sessionStorage 里面的数据在页面会话结束(刷新 or 关闭tab)时会被清除。

    // 保存数据到 sessionStorage
    sessionStorage.setItem('key', 'value');
    
    // 从 sessionStorage 获取数据
    let data = sessionStorage.getItem('key');
    
    // 从 sessionStorage 删除保存的数据
    sessionStorage.removeItem('key');
    
    // 从 sessionStorage 删除所有保存的数据
    sessionStorage.clear();
    

    loaclStorage

    // 保存数据到 localStorage
    localStorage.setItem('myCat', 'Tom');
    
    // 从 localStorage获取数据
    localStorage.getItem('myCat');
    
    // 从 localStorage删除保存的数据
    localStorage.removeItem('myCat');
    
    //从 localStorage删除所有保存的数据
    localStorage.clear();
    

    在两个页面中使用localStorage

    在A页面监听localStorage的变化:

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <title>A</title>
    </head>
    <body>
    <script>
        window.addEventListener("storage", function (e) {
            alert(e.newValue);
        });
    </script>
    </body>
    </html>
    

    在B页面

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <title>B</title>
    </head>
    <body>
    <script>
        localStorage.clear();
        localStorage.setItem('foo', 'bar');
    </script>
    </body>
    </html>
    

    注意两个页面要同源,运行结果是A页面会弹出内容。

    在一个页面中使用localStorage

    重写localStorage的方法,抛出自定义事件

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <title>A</title>
    </head>
    <body>
    <script>
        var orignalSetItem = localStorage.setItem;
        localStorage.setItem = function(key,newValue){
            var setItemEvent = new Event("setItemEvent");
            setItemEvent.newValue = newValue;
            window.dispatchEvent(setItemEvent);
            orignalSetItem.apply(this,arguments);
        }
        window.addEventListener("setItemEvent", function (e) {
            alert(e.newValue);
        });
        localStorage.setItem("nm","1234");
    </script>
    </body>
    </html>
    

    cookie

    HTTP Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。
    Cookie主要用于以下三个方面:

    • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
    • 个性化设置(如用户自定义设置、主题等)
    • 浏览器行为跟踪(如跟踪分析用户行为等)

    JavaScript通过Document.cookies访问Cookie

    document.cookie = "yummy_cookie=choco"; 
    document.cookie = "tasty_cookie=strawberry"; 
    console.log(document.cookie); 
    // logs "yummy_cookie=choco; tasty_cookie=strawberry"
    

    Cookie曾一度用于客户端数据的存储,因当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie渐渐被淘汰。由于服务器指定Cookie后,浏览器的每次请求都会携带Cookie数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器API已经允许开发者直接将数据存储到本地,如使用 Web storage API (本地存储和会话存储)或 IndexedDB

    三者异同

    三者都遵循浏览器的同源策略(相同的协议、相同的主机名、相同的端口下)
    localStorage只要在相同的协议、相同的主机名、相同的端口下,就能读取/修改到同一份localStorage数据。
    sessionStorage比localStorage更严苛一点,除了协议、主机名、端口外,还要求在同一窗口(也就是浏览器的标签页)下。

    生命周期:

    cookie:可设置失效时间,没有设置的话,默认是关闭浏览器后失效
    localStorage:除非被手动清除,否则将会永久保存。
    sessionStorage: 仅在当前网页会话下有效,关闭页面或浏览器后就会被清除。

    localStorage理论上来说是永久有效的,即不主动清空的话就不会消失,即使保存的数据超出了浏览器所规定的大小,也不会把旧数据清空而只会报错。但需要注意的是,在移动设备上的浏览器或各Native App用到的WebView里,localStorage都是不可靠的,可能会因为各种原因(比如说退出App、网络切换、内存不足等原因)被清空。
    sessionStorage的生存期顾名思义,类似于session,只要关闭浏览器(也包括浏览器的标签页),就会被清空。由于sessionStorage的生存期太短,因此应用场景很有限,但从另一方面来看,不容易出现异常情况,比较可靠。

    存放数据大小:

    cookie:4KB左右
    localStorage和sessionStorage:可以保存5MB的信息。

    http请求:

    cookie:每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题
    localStorage和sessionStorage:仅在客户端(即浏览器)中保存,不参与和服务器的通信

    易用性:

    cookie:需要程序员自己封装,原生的Cookie接口不友好
    localStorage和sessionStorage:原生接口可以接受,亦可再次封装来对Object和Array有更好的支持


    参考:
    cookie、localStorage和sessionStorage 三者之间的区别
    localstorage 必知必会
    MDN文档
    h5 storage事件监听

    相关文章

      网友评论

          本文标题:sessionStorage、localStorage 、coo

          本文链接:https://www.haomeiwen.com/subject/owjnpqtx.html