Web存储机制—sessionStorage,localStorage使用方法

Web存储机制,在这里主要聊有关于Web Storage API提供的存储机制,通过该机制,浏览器可以安全地存储键值对,比使用cookie更加直观。接下来简单的了解如何使用这方面的技术。

基本概念

Web Storage 包含两种机制:

  • sessionStorage为每一个给定的源维持一个独立的存储区域,该区域在页面会话期间可用(即只要浏览器处于打开状态,包括页面重新加载和恢复)
  • localStorage同样的功能,但是在浏览器关闭,然后重新打开后数据仍然存在

这两种机制是通过Window.sessionStorageWindow.localStorage属性使用。更确切的说,在支持的浏览器中Window对象实现了WindowLocalStorageWindowSessionStorage对象并挂在其localStoragesessionStorage属性下。调用其中任一对象会创建Storage对象,通过Storage对象,可以设置、获取和移除数据项。对于每个源sessionStoragelocalStorage使用不同的Storage对象。

例如,在文档中调用localStorage将会返回一个Storage对象,调用sessionStorage返回一个不同的Storage对象。可以使用相同的方式操作这些对象,但是操作是独立的。

在了解如何使用localStoragesessionStorage之前,先来一下Storage对象。

Storage对象

Storage对象作为Web Storage API的接口,Storage提供了访问特定域名下的会话存储或本地存储的功能。例如,可以添加、修改或删除存储的数据项。

如果想操作一个域名的会话存储,可以使用Window.sessionStorage;如果想要操作一个域名的本地存储,可以使用Window.localStorage

Storage对象的属性和方法

Storage对象提供自己的属性和方法:

  • Storage.length:返回一个整数,表示存储在Storage对象中的数据项数量。这个是Storage对象的一个属性,而且是一个只读属性。
  • Storage.key():该方法接受一个数值n作为参数,并返回存储中的第n个键名
  • Storage.getItem():该方法接受一个键名作为参数,返回键名对应的值
  • Storage.setItem():该方法接受一个键名和值作为参数,将会把键值对添加到存储中,如果键名存在,则更新其对应的值
  • Storage.removeItem():该方法接受一个键名作为参数,并把该键名从存储中删除
  • Storage.clear():调用该方法会清空存储中的所有键名

简单的示例

写一个简单的示例,页面就三个按钮:SetGetRemove。按钮点击时,分别绑定三个函数:setStorage()getStorage()removeStorage()

  • setStorage():做了localStoragesessionStorage存储,同时存的键名为name,键值为W3cplus.com
  • getStorage():取得存储的name,并打印出来
  • removeStorage():移除setStorage()函数中存储的name

来看一下操作得到的效果。

首先点击Set按钮。使用浏览器开发者工具,我们可以看到Local StorageSession Storage都存了一个name的键名,其对应的键值为W3cplus.com。如下图所示:

Local Storage截图

Session Storage截图

这个时候点击Get按钮,可以分别获取setStorage()存的name的值,并且输出:

接下来,再点击Remove按钮,再次打开开发者工具,查看Local StorageSession Storage选项,可以看到,当初对应的KeyValue被清空了,比如下面截图是Session Storage

这个时候,再次点击Get按钮,输出的内容为null

上面我们看到的是第一种现象。我们再来看第二种。先点击Set按钮,再点击Get按钮,可以看到下面的输出的内容:

同样的页面,再不做Remove按钮操作,直接把浏览器窗口关闭,然后重新加载页面,并且直接点击Get按钮,看到的页面输出内容:

可以看出localStorage输出的内容还是W3cplus.com,而sessionStorage输出的内容变成null了。从这个效果也验证了前面提到的:sessionStoragelocalStorage类似,允许你访问一个Storage对象,只不过sessionStorage访问的是一个session Storage对象,而localStorage访问的是一个local Storage对象。另外不同之处在于localStorage里面存储的数据没有过期的时间设置,而存储在sessionStorage里面的数据在页面会话结束时会被清除。页面会话在浏览器打开期间一直保持,并且重新加载或恢复页面仍然会保持原来的页面会话。在新标签或窗口打开一个页面会初始化一个新的会话(localStoragekeyvalue依旧保存,而sessionStoragekeyvalue会被清除)

本地存储基本用法

前面的示例也演示过了,接下来拿localStorage来做示例:

localStorage.setItem(‘key‘, ‘value‘); // 设置一个localStorage,名称叫`key`
localStorage.getItem(‘key‘); // 获取存储的localStorage,获取的`key`对应的值`value`
localStorage.removeItem(‘key‘); // 移除存储的localStorage,删除的名称`key`
localStorage.clear(); // 删除所有的localStorage

为了方便使用,可以对其进行封装。

设置localStorage

function setLocalStorage(key, value) {
   return localStorage.setItem(key, value);
}

获取localStorage

function getLocalStorage(key) {
    return localStorage.getItem(key);
}

移除localStorage

function removeLocalStorage(key) {
    return localStorage.removeItem(key);
}

注:sessionStorage使用方法和localStorage类似。

异常处理

localStorage在目前的浏览器环境来说,还不是完全稳定的,可能会出现各种各样的问题,所以在设置localStorage时一定要考虑异常处理。localStorage的异常处理一般用try/catch来捕获/处理异常。所以我们在设置localStorage需要将try/catch添加进来,所以前面的setLocalStorage()函数可以修改成:

function setLocalStorage(key, value) {
   try {
        localStorage.setItem(key, value);
   } catch (e) {
        if (e.name === ‘QUOTA_EXCEEDED_ERR‘ || e.name === ‘NS_ERROR_DOM_QUOTA_REACHED‘) {
            console.log("Error: Local Storage limit exceeds.");
            localStorage.clear();
        } else {
            console.log("Error: Saving to local storage.");
        }
   }
}

如果考虑更具浏览器兼容性,我们还可以将上面的代码修改成:

function setLocalStorage(key, value) {
    try {
        localStorage.setItem(key, value);
    } catch(e) {
        if (isQuotaExceeded(e)) {
            console.log("Error: Local Storage limit exceeds.");
            localStorage.clear();
        } else {
            console.log("Error: Saving to local storage.");
        }
    }
}

function isQuotaExceeded(e) {
    var quotaExceeded = false;

    if (e) {
        if (e.code) {
            switch (e.code) {
                case 22:
                    quotaExceeded = true;
                    break;
                case 1014:
                    // Firefox
                    if (e.name === ‘NS_ERROR_DOM_QUOTA_REACHED‘) {
                        quotaExceeded = true;
                    }
                    break;
            }
        } else if (e.number === -2147024882) {
            // IE8
            quotaExceeded = true;
        }
    }
    return quotaExceeded;
}

过期时间

localStorage而言,其原生是不支持设置过期时间的,想要设置的话,就只能自己来封装一层逻辑来实现:

function setLocalStorage(key, value) {
    var curtime = new Date().getTime(); // 获取当前时间
    // 转换成JSON字符串序列
    var valueDate = JSON.stringify({
        val: value,
        timer: curtime
    });
    try {
        localStorage.setItem(key, valueDate); // 将JSON字符串设置为存储值
    } catch(e) {
        if (isQuotaExceeded(e)) {
            console.log("Error: Local Storage limit exceeds.");
            localStorage.clear();
        } else {
            console.log("Error: Saving to local storage.");
        }
    }
}

function isQuotaExceeded(e) {
    var quotaExceeded = false;

    if (e) {
        if (e.code) {
            switch (e.code) {
                case 22:
                    quotaExceeded = true;
                    break;
                case 1014:
                    // Firefox
                    if (e.name === ‘NS_ERROR_DOM_QUOTA_REACHED‘) {
                        quotaExceeded = true;
                    }
                    break;
            }
        } else if (e.number === -2147024882) {
            // IE8
            quotaExceeded = true;
        }
    }
    return quotaExceeded;
}

function getLocalStorage(key,exp){
    var vals = localStorage.getItem(key); // 获取本地存储的值
    var dataObj = JSON.parse(vals); // 将字符串转换成JSON对象
    // 如果(当前时间 - 存储的元素在创建时候设置的时间) > 过期时间
    var isTimed = (new Date().getTime() - dataObj.timer) > exp;
    if (isTimed){
        console.log("expires");
    } else {
        var newValue = dataObj.val;
    }
    return newValue;
}

这个时候我们调用:

setLocalStorage(‘name‘, ‘hello, w3cplus.com!‘);
var localKey = getLocalStorage(‘name‘, 2);
console.log(localKey);

如果我们把exp的时间修改一下:

setLocalStorage(‘name‘, ‘hello, w3cplus.com!‘);
var localKey = getLocalStorage(‘name‘, 0);
console.log(localKey);

作用域名

(图片来自:https://segmentfault.com/a/1190000004121465)

这里的所说的作用域名不是指函数中的作用域。而且localStorage存储的作用域。所以指的是如何隔离开不同页面之间的localStoragelocalStorage只要在相同的协议、相同的主机名、相同的端口下,就能读取和修改到同一份localStorage存储的数据。而sessionStorage要比localStorage更苛刻一些,除了协议、主机名、端口外,还要求在同一窗口下。

容量限制

对于localStoragesessionStorage存储是有一定的限制的,目前业界基本上统一为5M,要比cookies4K大得多,一般情况已足够使用。如果存储的量大于最大值时,各浏览器都会抛出一个错误QUOTA_EXCEEDED_ERR

浏览器兼容性

到目前为止 Web Storage得到众多主流浏览器的支持,有关于浏览器对其支持度,可以通过Caniuse.com来查阅

总结

最近在做造物节项目,碰到了本地存储的需求,以前从示接触过,为了能较好的理解和整明白Web本地存储的相关知识,花了点时间学习了相关的知识,并做了一些笔记。因为初学相关知识,不免其中有错误之处,如果有不对之处,还请同行大婶拍砖指正。另外特别推荐一篇@Mathias整理的一篇文章《How I detect and use localStorage》。能帮助大家更好的理解有关于localStorage相关知识。如果你有更好的教程或经验,欢迎在下面的评论中与我们一起分享。

原文: http://www.w3cplus.com/javascript/web-storage.html © w3cplus.com

时间: 2024-12-16 00:37:20

Web存储机制—sessionStorage,localStorage使用方法的相关文章

web存储机制(localStorage和sessionStorage)

web存储包括两种:sessionStorage 和 localStorage(都是限定在文档源级别,非同源文档间无法共享) 1.sessionStorage 数据放在服务器上(IE不支持) 严格用于一个浏览器会话中存储数据,数据在浏览器关闭后会立即删除 2.localStorage 数据在客户端(低版本IE ( IE6, IE7 ) 不支持,并且不支持查询语言) 跨会话持久化地存储数据 localStorage与sessionStorage的区别: localStorage只要在相同的协议.相

HTML5分析实战Web存储机制(Web Storage)

Web Storage它是Key-Value在持久性数据存储的形式.Web Storage为了克服cookie把所引起的一些限制.当数据需要严格格控制client准时,没有必要不断地发回数据server. Web Storage有两个目的:提供一种存储会话数据的路径;提供存储大量能够跨会话存在的数据的机制. 最初的Web Storage规范包括了两个对象的定义:sessionStorage对象和globalStorage对象.这两个对象在支持的浏览器中都是以window对象属性的形式存在.支持s

HTML5实战与剖析之Web存储机制(Web Storage)

Web Storage是以Key-Value的形式进行数据持久性存储.Web Storage是为了克服由cookie带来的一些限制而产生的.当数据需要被严格控制在客户端上的时候,无须持续地将数据发回服务器.Web Storage的目标有两个:提供一种存储会话数据的路径;提供存储大量可以跨会话存在的数据的机制. 最初的Web Storage规范包含了两个对象的定义:sessionStorage对象和globalStorage对象.这两个对象在支持的浏览器中都是以window对象属性的形式存在,支持

Web存储机制

在应用cookie的时候,自己在想,有没有一种存储数据的方法不用像Cookie这样需要依赖于服务器运行,终于,今天看到了  js高程  Web存储机制的那一部分,好像打开了新世界的大门..... Web  Storage 的主要目标, 1,提供一种在Cookie之外存储会话数据的途径 2,提供一种存储大量可以跨会话存在的数据的机制 通过Storage类型来存储的名值对儿,有如下方法: 1.clear(),  删除所有值 2.getItem(),根据指定的名字name获取对应的值 3.key( i

本地存储-localStroage/sessionStorage存储

客户端存储 l  WEB存储 web存储最初作为html5的一部分被定义成API形式,但是后来被剥离出来作为独立的一份标准.该标准目前还在草案阶段,但其中一部分内容已经被包括IE8在内的所有主流浏览器实现了.Web存储标准所描述的API包含localStorage对象和sessionStorage对象,这两个对象实际上是持久化关联数组,是名值对的映射表.名值都是字符串. l  cookie 是一种早期的客户端存储机制,起初是针对服务器端脚本使用的.尽管在客户端提供了非常繁琐的js api来操作c

【转】本地存储-localStroage/sessionStorage存储

原文地址:[js学习笔记-103]----本地存储-localStroage/sessionStorage存储 客户端存储 l  WEB存储 web存储最初作为html5的一部分被定义成API形式,但是后来被剥离出来作为独立的一份标准.该标准目前还在草案阶段,但其中一部分内容已经被包括IE8在内的所有主流浏览器实现了.Web存储标准所描述的API包含localStorage对象和sessionStorage对象,这两个对象实际上是持久化关联数组,是名值对的映射表.名值都是字符串. l  cook

web 存储

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

Html5之高级-13 Web存储API (两个存储系统、sessionStorage、localStorage)

一.两个存储系统 两个存储系统 - 万维网最初的设想,是作为展示信息的一种方式.信息处理是后来才出现的,但是Web的实质并没有变---信息在服务器上处理,然后显示给用户.因为系统没有利用计算机资源,所以复杂操作都是在服务器上完成的 - 对于任何程序来说,能够实现数据存储是必备功能之一,并且在需要的时候能够提供数据.但在过去的Web用户端,没有能够支持数据存储的有效机制 - cookie曾用来在客户端存储少量信息,但受其性质所限,cookie只能存储一些短的字符串 - 在 HTML5中提供了 We

使用HTML5 Web存储的localStorage和sessionStorage方式

localStorage(本地存储),可以长期存储数据,没有时间限制,一天,一年,两年甚至更长,数据都可以使用.sessionStorage(会话存储),只有在浏览器被关闭之前使用,创建另一个页面时同意可以使用,关闭浏览器之后数据就会消失. HTML5 的本地存储 API 中的 localStorage 与 sessionStorage 在使用方法上是相同的,区别在于 sessionStorage 在关闭页面后即被清空,而 localStorage 则会一直保存.我们这里以 localStora