• Session,Cookie 和local storage的区别


    以前从没有听说过local storage, 在网上查了一些资料,得到如下结论

    从存储位置看,分为服务器端存储和客户端存储两种

    服务器端: session

    浏览器端: cookie, localStorage, sessionStorage

    转载自 http://www.lixuejiang.me/2016/09/11/cookie-session-localstorage-sessionStorage%E5%8C%BA%E5%88%AB%E5%92%8C%E4%BB%8B%E7%BB%8D/

    cookie

    cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命周期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。以下是cookie的操作方式:

    //设置cookie
    function setCookie(cname, cvalue, exdays) {
        var d = new Date();
        d.setTime(d.getTime() + (exdays*24*60*60*1000));
        var expires = "expires="+d.toUTCString();
        document.cookie = cname + "=" + cvalue + "; " + expires;
    }
    //获取cookie
    function getCookie(cname) {
        var name = cname + "=";
        var ca = document.cookie.split(';');
        for(var i=0; i<ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0)==' ') c = c.substring(1);
            if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
        }
        return "";
    }
    //清除cookie  
    function clearCookie(name) {  
        setCookie(name, "", -1);  
    }

    由于cookie是存储在客户端,如果cookie被窃取,会造成安全性问题,如跨站请求伪造。另外由于每次客户端像服务端发起请求的时候都会带上cookie,所以会增加每次http请求的传输量。因此提出了cookie隔离的概念。

    cookie隔离

    把js,css,图片等静态资源放在非主域名下,这样在请求这些资源的时候就不会带上主域名的cookie。从而降低传输成本和服务端的压力

    session

    • session存放在服务端,类似散列表的形势,每一个session有一个sessionId。
    • 客户端发起请求的时候会带上sessionID
    • 如果没有sessionID,在服务端会新建一个sessionId,然后返回给客户端

      localStorage

      localStorage是html5提出的,在此之前,IE已经有userData这种实现方式.  localStorage是windows的一个对象:

    基本操作

    Set

    localStorage.name = 'ggbond';
    localStorage["name"] = "ggbond";
    localStorage.setItem("name","ggbond");

    get

    var name = localStorage["name"];
    var name = localStorage.name;
    var name = localStorage.getItem("name");

    foreach

    localStorage提供了key方法,来获取里面所有的key

    var storage = window.localStorage;
    function showStorage(){
     for(var i=0;i<storage.length;i++){
      //key(i)获得相应的键,再用getItem()方法获得对应的值
      document.write(storage.key(i)+ " : " + storage.getItem(storage.key(i)) + "<br>");
     }
    }

    delete

    localStorage.removeItem("name");

    clearAll

    localStorage.clear()

    相关事件

    HTML5的本地存储,还提供了一个storage事件,可以对键值对的改变进行监听,使用方法如下:

     if(window.addEventListener){
         window.addEventListener("storage",handle_storage,false);
    }else if(window.attachEvent){
         window.attachEvent("onstorage",handle_storage);
    }
    function handle_storage(e){
     if(!e){e=window.event;}
     //showStorage();
    }
    
     

    对于事件变量e,是一个StorageEvent对象,提供了一些实用的属性,可以很好的观察键值对的变化,如下表:

    PropertyTypeDescription
    key String The named key that was added, removed, or moddified
    oldValue Any The previous value(now overwritten), or null if a new item was added
    newValue Any The new value, or null if an item was added
    url/uri String The page that called the method that triggered this change

    sessionStorage

    sessionStorage 方法针对一个 session 进行数据存储。当用户关闭浏览器窗口后,数据会被删除。操作方法和localStorage类似

    以下文章我觉得写的很好,转载自 http://jerryzou.com/posts/cookie-and-web-storage/

    Cookie 是小甜饼的意思。顾名思义,cookie 确实非常小,它的大小限制为4KB左右,是网景公司的前雇员 Lou Montulli 在1993年3月的发明。它的主要用途有保存登录信息,比如你登录某个网站市场可以看到“记住密码”,这通常就是通过在 Cookie 中存入一段辨别用户身份的数据来实现的。

    localStorage

    localStorage 是 HTML5 标准中新加入的技术,它并不是什么划时代的新东西。早在 IE 6 时代,就有一个叫 userData 的东西用于本地存储,而当时考虑到浏览器兼容性,更通用的方案是使用 Flash。而如今,localStorage 被大多数浏览器所支持,如果你的网站需要支持 IE6+,那以 userData 作为你的 polyfill 的方案是种不错的选择。

    sessionStorage

    sessionStorage 与 localStorage 的接口类似,但保存数据的生命周期与 localStorage 不同。做过后端开发的同学应该知道 Session 这个词的意思,直译过来是“会话”。而 sessionStorage 是一个前端的概念,它只是可以将一部分数据在当前会话中保存下来,刷新页面数据依旧存在。但当页面关闭后,sessionStorage 中的数据就会被清空。

    三者的异同

    特性CookielocalStoragesessionStorage
    数据的生命期 一般由服务器生成,可设置失效时间。如果在浏览器端生成Cookie,默认是关闭浏览器后失效 除非被清除,否则永久保存 仅在当前会话下有效,关闭页面或浏览器后被清除
    存放数据大小 4K左右 一般为5MB
    与服务器端通信 每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题 仅在客户端(即浏览器)中保存,不参与和服务器的通信
    易用性 需要程序员自己封装,源生的Cookie接口不友好 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持

    应用场景

    有了对上面这些差别的直观理解,我们就可以讨论三者的应用场景了。

    因为考虑到每个 HTTP 请求都会带着 Cookie 的信息,所以 Cookie 当然是能精简就精简啦,比较常用的一个应用场景就是判断用户是否登录。针对登录过的用户,服务器端会在他登录时往 Cookie 中插入一段加密过的唯一辨识单一用户的辨识码,下次只要读取这个值就可以判断当前用户是否登录啦。曾经还使用 Cookie 来保存用户在电商网站的购物车信息,如今有了 localStorage,似乎在这个方面也可以给 Cookie 放个假了~

    而另一方面 localStorage 接替了 Cookie 管理购物车的工作,同时也能胜任其他一些工作。比如HTML5游戏通常会产生一些本地数据,localStorage 也是非常适用的。如果遇到一些内容特别多的表单,为了优化用户体验,我们可能要把表单页面拆分成多个子页面,然后按步骤引导用户填写。这时候 sessionStorage 的作用就发挥出来了。

    安全性的考虑

    需要注意的是,不是什么数据都适合放在 Cookie、localStorage 和 sessionStorage 中的。使用它们的时候,需要时刻注意是否有代码存在 XSS 注入的风险。因为只要打开控制台,你就随意修改它们的值,也就是说如果你的网站中有 XSS 的风险,它们就能对你的 localStorage 肆意妄为。所以千万不要用它们存储你系统中的敏感数据。

  • 相关阅读:
    nginx重启命令
    Java中Vector笔记
    JAVA中字符串比较equals()和equalsIgnoreCase()的区别
    HashMap和TreeMap的常用排序方法
    Logger用法
    HashMap和Hashtable的区别
    class.getDeclaredFields()与class.getFields()
    java中 文件压缩处理
    Java远程执行Shell命令
    python 学习笔记 redis操作
  • 原文地址:https://www.cnblogs.com/wphl-27/p/5930475.html
Copyright © 2020-2023  润新知