存储

浏览器端存储方法

  • IndexdDB
    HTML5 的本地存储,把一些数据存储到浏览器(客户端)中,当与网络断开时,可以从浏览器中读取数据,用来做一些离线应用。
  • Cookie 通过在客户端 ( 浏览器 ) 记录信息确定用户身份,最大为 4 kb 。最大4096B
  • url 参数用的是 get 方法, 从服务器上获取数据,大小不能大于 2 kb 。
  • post 是 向服务器传送数据,数据量较大。
  • local Storage 也是 HTML5 的本地存储,将数据保存在客户端中(一般是永久的)。
  • userData 存储数据,IE 支持,基本很少使用到,除非有很强的浏览器兼容需求。

服务器端存储方法

  • Session 是服务器端使用的一种记录客户端状态的机制 。虽然需要 cookie 支持(通常存放加密过的 sessionId),但是不在浏览器端存放主要信息
  1. 共同点:都是保存在浏览器端,且同源的。
  2. 区别:

    1. cookie数据 始终在同源的http请求中携带(即使不需要),即 cookie在浏览器和服务器间来回传递。而sessionStorage和localStorage不会自动把数据发给服务器, 仅在本地保存。cookie数据还有路径(path)的概念,可以限制cookie只属于某个路径下。
    2. 存储大小限制不同
      • cookie数据 不能超过4k,同时因为每次http请求都会携带cookie,所以cookie只适合保存很小的数据,如会话标识。
      • sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多, 可以达到5M或更大
    3. 数据有效期不同

      • sessionStorage: 仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持;
      • localStorage:没有时间限制的数据存储 , 始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据,只能通过手动删除缓存来清除,不能设置失效时间;
      • cookie只在设置的 cookie过期时间之前一直有效,即使窗口或浏览器关闭。
    4. 作用域不同

      • sessionStorage 不在不同的浏览器窗口共享,即使是同一个页面
      • localStorage在 所有同源窗口中都是共享的
      • cookie也是 在所有同源窗口中都是共享的
    5. sessionStorage和localStorage两者虽然对存储的内容比cookie(4k左右)大得多(5M左右),但是存入的东西都被转换成了字符串,也就是说无法存入数组或者对象,就算存入了也会被转化为字符串
    6. Web Storage支持事件通知机制,可以将数据更新的通知发送给监听者。
    7. Web Storage 的 api 接口使用更方便
    8. localStorage和sessionStorage都具有相同的操作方法,例如setItem()、getItem()和removeItem()等
      写入字段有三种方式:
      localStorage[“a”]=1;
      localStorage.b=1;
      localStorage.setItem(“c”,3);
      读取字段也有三种方式:
      var a= localStorage.a;
      var b= localStorage[“b”];
      var c= localStorage.getItem(“c”);

Cookie实现的功能

记录访问者的信息,访问者的信息一般都可以处理成 kv 键值对的形式,所以可以保存在 Cookie 中
在页面之间传递信息,通过设置 Cookie 的 path 等属性,可以在特定域名或 URI 下共享 Cookie 信息
自动识别用户,通过在 Cookie 中保存用户uid、服务器会话sid等方法,可以记录用户登录状态

Cookie机制

  • 正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。
  • 而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
  • 因为JS运行在浏览器中,是单线程的,每个window一个JS线程,既然是单线程的,在某个特定的时刻只有特定的代码能够被执行,并阻塞其它的代码。而浏览器是事件驱动的(Event driven),浏览器中很多行为是异步(Asynchronized)的,会创建事件并放入执行队列中。
  • javascript引擎是单线程处理它的任务队列,你可以理解成就是普通函数和回调函数构成的队列。当异步事件发生时,如mouse click, a timer firing, or an XMLHttpRequest completing(鼠标点击事件发生、定时器触发事件发生、XMLHttpRequest完成回调触发等),将他们放入执行队列,等待当前代码执行完成。

猜你喜欢

转载自blog.csdn.net/qq_41401130/article/details/81625333