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});

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343