2018-06-17

Client storage

cookie

Wiki: Cookie (plural form cookies), which refers to some data (usually encrypted) stored on the user's local terminal (Client Side) to identify the user's identity.

cookie的原理与实现

服务器在http响应头中添加Set-Cookie信息,浏览器收到响应后会根据头中的字段保存cookie,下一次访问时在请求头中附带cookie内容,供服务器根据cookie值进行后续处理。

```

eswedwae

```

**sessionID**

response header


    HTTP/1.1 200 OK

    Content-type: text/html

    Set-cookie: name=value

    Other-header: other-header-value


    request header


    GET /index.html HTTP/1.1

    Cookie: name=value

    Other-header: other-header-value

```

**cookie的构成与限制**

- 名称-值 name-value:名称不区分大小写;值为字符串,两者都必须被URL编码。

    var CookieUtil = {

    get: function (name){

        var cookieName = encodeURIComponent(name) + "=",

            cookieStart = document.cookie.indexOf(cookieName),

            cookieValue = null,

            cookieEnd;

        if (cookieStart > -1){

            cookieEnd = document.cookie.indexOf(";", cookieStart);

            if (cookieEnd == -1){

                cookieEnd = document.cookie.length;

            }

            cookieValue = decodeURIComponent(document.cookie.substring(

            cookieStart + cookieName.length, cookieEnd));

        }

        return cookieValue;

    },

    set: function (name, value, expires, path, domain, secure) {

        var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value);

        if (expires instanceof Date) {

            cookieText += "; expires=" + expires.toGMTString();

        }

        if (path) {

            cookieText += "; path=" + path;

        }

        if (domain) {

            cookieText += "; domain=" + domain;

        }

        if (secure) {

            cookieText += "; secure";

        }

        document.cookie = cookieText;

    },

    unset: function (name, path, domain, secure){

        this.set(name, "", new Date(0), path, domain, secure);

    }

    }

- 域 domain:cookie对哪个域有效,浏览器向该域发送的请求中都会包含这个cookie。若域x

  =www.A.com,那么只有访问x时才会发送该cookie;若x = .A.com,则访问x的子域如bb.A.com也会发送。

  **同源策略**

``

    HTTP/1.1 200 OK

    Content-type: text/html

    Set-cookie: name=value;expires=Mon, 22-jan-07 07:10:22 GMT; domain=.wrox.com

    Other-header: other-header-value

``

- 失效时间 expires:表示cookie何时应该被删除的时间戳,也就是何时停止向服务器发送该cookie。若设置为以前的时间,则立即删除

- 路径 path:对于访问指定域中的路径,才向服务器发送该cookie

,   

    HTTP/1.1 200 OK

    Content-type: text/html

    Set-cookie: name=value;path=/; secure

    Other-header: other-header-value

- 安全标志 secure: true表示仅https才发送该cookie

- httpOnly: true表示该cookie不能被浏览器访问,只能被服务器访问

>  Cookie容量限制

一、浏览器允许每个域名所包含的cookie数:

  Microsoft指出InternetExplorer8增加cookie限制为每个域名50个,但IE7似乎也允许每个域名50个cookie。

  Firefox每个域名cookie限制为50个。

  Opera每个域名cookie限制为30个。

  Safari/WebKit貌似没有cookie限制。但是如果cookie很多,则会使header大小超过服务器的处理的限制,会导致错误发生。

二、当很多的cookie被设置,浏览器如何去响应。

  除Safari(可以设置全部cookie,不管数量多少),有两个方法:

  最少最近使用(leastrecentlyused(LRU))的方法:当Cookie已达到限额,自动踢除最老的Cookie,以使给最新的Cookie一些空间。InternetExplorer和Opera使用此方法。

  Firefox很独特:虽然最后的设置的Cookie始终保留,但似乎随机决定哪些cookie被保留。似乎没有任何计划(建议:在Firefox中不要超过Cookie限制)。

三、不同浏览器间cookie总大小也不同:

  Firefox和Safari允许cookie多达4097个字节,包括名(name)、值(value)和等号。

  Opera允许cookie多达4096个字节,包括:名(name)、值(value)和等号。

  InternetExplorer允许cookie多达4095个字节,包括:名(name)、值(value)和等号。

**localStorage, SessionStorage**

----------

与 cookie 不同,存储限制要大得多(至少5MB),并且信息不会被传输到服务器。

HTML 本地存储提供了**两个**在客户端存储数据的对象:

**window.localStorage** - 存储没有截止日期的数据

**window.sessionStorage** - 针对一个 session 来存储数据(当关闭浏览器标签页时数据会丢失)

**IndexedDB**

----------

> IndexedDB是在浏览器中保存结构化数据的一种数据库,IndexedDB的思想是创建一套API,方便保存和读取JavaScript对象,同时支持查询和搜索。IndexedDB的最大特色是使用对象保存数据。一个IndexedDB数据库,就是一组位于相同命名空间下的对象的集合。

- IndexedDB打开数据库

IndexedDB是一个作为API宿主的全局对象,由于IndexedDB设计的操作为异步进行,所以大多数的操作为请求操作,打开数据库即向数据库发送open请求,如下代码所示,发送请求后,如果数据库存在,就打开该数据库,如果数据库不存在,就创建并打开该数据库,打开该数据库成功后会返回一个IDBOpenDBRequest对象,这个对象上可以添加一系列的处理程序,如代码中的onerror事件和onsuccess事件,在onsuccess中可以得到IDBDatabase对象。

    var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;

    var request,database;

    request = indexedDB.open('test');

    request.onerror = function(e){

      console.log(e.target.errorCode);

    };

    request.onsuccess = function(e){

      database = e.target.result;

      console.log('创建或打开数据库成功') ;

    }

  **IndexedDB对象存储空间**

在建立或者打开数据库后,我们一般的操作是建立表,向表中插入数据,在IndexedDB中,用对象存储空间ObjectStore来代替表的概念,存储空间中的对象就相当于表中插入的数据。在上一步打开数据库的onsuccess中我们可以获得到IDBDatabase对象,创建存储空间就是在通过该对象调用createObjectStore函数。

    var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;

    var request,database;

    request = indexedDB.open('test');

    request.onerror = function(e){

      console.log(e.target.errorCode);

    };

    request.onsuccess = function(e){

      database = e.target.result;

      console.log('创建或打开数据库成功') ;

    }

- 索引

在建立存储空间时,如果我们想为存储空间指定多个键要怎么办呢?IndexedDB提供了创建索引的方式,下面我们看一下如何创建索引以及索引的作用。

要创建索引,首先要引用对象存储空间,然后调用createIndex()方法,如下示例:

    var store = db.transaction("users").objectStore("users"),

    index = store.createIndex("age","age",{unique:false});

你可能感兴趣的:(2018-06-17)