首页 > 其他分享 >Web(storage) 存储

Web(storage) 存储

时间:2023-12-01 22:02:31浏览次数:44  
标签:Web 存储 浏览器 sessionStorage storage localStorage key

Web Storage API 提供了存储机制,通过该机制,浏览器可以安全地存储键值对,比使用 cookie 更加直观。

一、基本概念

存储对象是简单的键值存储,类似于对象,但是它们在页面加载时保持完整。键和值始终是字符串(请注意,与对象一样,整数键将自动转换为字符串)。您可以像访问对象一样访问这些值,或者使用 Storage.getItem() 和 Storage.setItem() 方法。这三行都设置了(相同的)colorSetting 条目:

localStorage.colorSetting = '#a4509b';
localStorage['colorSetting'] = '#a4509b';
localStorage.setItem('colorSetting', '#a4509b');

Web Storage 包含如下两种机制:

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

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

二、功能检测

为了能够使用 localStorage,我们应该首先验证它是否在当前浏览会话中受支持并可用。

支持 localStorage 的浏览器将在窗口对象上具有一个名为 localStorage 的属性。但是,仅断言该属性存在可能会引发异常。如果 localStorage 确实存在,则仍然不能保证 localStorage 实际可用,因为各种浏览器都提供了禁用 localStorage 的设置。因此,浏览器可能支持 localStorage,但不适用于页面上的脚本。

例如,私有浏览模式下的 Safari 浏览器为我们提供了一个空的 l ocalStorage 对象,其配额为零,实际上使它无法使用。相反,我们可能会收到合法的 QuotaExceededError,这意味着我们已经用完了所有可用的存储空间,但实际上存储空间可用。我们的功能检测应考虑这些情况。

这是一个检测 localStorage 是否同时受支持和可用的函数:

function storageAvailable(type) {
    var storage;
    try {
        storage = window[type];
        var x = '__storage_test__';
        storage.setItem(x, x);
        storage.removeItem(x);
        return true;
    }
    catch(e) {
        return e instanceof DOMException && (
            // everything except Firefox
            e.code === 22 ||
            // Firefox
            e.code === 1014 ||
            // test name field too, because code might not be present
            // everything except Firefox
            e.name === 'QuotaExceededError' ||
            // Firefox
            e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&
            // acknowledge QuotaExceededError only if there's something already stored
            (storage && storage.length !== 0);
    }
}

以上是一个相对正式一点的例子,如果使用更简单的方法,可以判断windows是否存在storage属性,如果不存在就是浏览器不支持,或者浏览器禁用了

三、基本方法或属性

storage.length  :返回键/值对的数量。

storage.key:如果n大于或等于键/值对的数量,返回第n个键的名称,或者为null

storage.getItem(key):返回与给定键关联的当前值,或者为null 如果给定的 key不存在。

storage.setItem(key, value):将由键标识的值设置为value,从而创建一个新的键/值对(如果先前键不存在)。

四、localStorage

1、描述

存储的键和值始终采用 UTF-16 字符串格式,每个字符使用两个字节。与对象一样,整数键会自动转换为字符串

localStorage数据特定于文档的协议。特别是,对于通过 HTTP 加载的站点(例如,),返回的对象与通过 HTTPS 加载的相应站点(例如,)。

http://example.com  localStorage

https://example.com localStorage

使用的协议不同,对应的localStorage也是不同,他们之间是相互隔离的。

对于从 URL 加载的文档(即,直接从用户的本地文件系统在浏览器中打开的文件,而不是从 Web 服务器提供的文件),行为要求是未定义的,并且可能因不同的浏览器而异。

在所有当前的浏览器中,似乎为每个URL返回不同的对象。换句话说,每个 URL 似乎都有自己独特的本地存储区域。但是没有关于该行为的保证,因此您不应依赖它,因为如上所述,URL 的要求仍未定义。因此,浏览器可能随时更改其 URL 处理。事实上,随着时间的推移,一些浏览器已经改变了对它的处理方式。

一般情况下,浏览器localStorage 的存储大小一般在5M左右,存储大小的限制,在W3C标准中并没有明确规则限制的大小是多少,所有各个浏览器根据自己情况,设置了一个上限值。

2、实例
// 获取localStorage 的长度
localStorage.length   // 21
 
// 保存到 localStorage
localStorage.setItem('key', 'value');
 
// 从 localStorage 获取值
localStorage.getItem('key');
 
// 从 localStorage 删除某个key
localStorage.removeItem('key');
 
// 清除 localStorage 保存的所有数据
localStorage.clear();

五、sessionStorage

1、描述

sessionStorage 属性允许你访问一个,对应当前源的 sessionStorage对象。它与 localStorage相似,不同之处在于 localStorage 里面存储的数据没有过期时间设置,而存储在sessionStorage 里面的数据在页面会话结束时会被清除。

  • 页面会话在浏览器打开期间一直保持,并且重新加载或恢复页面仍会保持原来的页面会话。
  • 在新标签或窗口打开一个页面时会复制顶级浏览会话的上下文作为新会话的上下文,这点和 session cookie 的运行方式不同。
  • 打开多个相同的 URL 的 Tabs 页面,会创建各自的 sessionStorage。
  • 关闭对应浏览器标签或窗口,会清除对应的 sessionStorage。
2、实例
// 获取 sessionStorage 的长度
sessionStorage.length   // 21
 
// 保存到 sessionStorage
sessionStorage.setItem('key', 'value');
 
// 从 sessionStorage 获取值
sessionStorage.getItem('key');
 
// 从 sessionStorage 删除某个key
sessionStorage.removeItem('key');
 
// 清除 sessionStorage 保存的所有数据
sessionStorage.clear();

六、StorageEvent(存储事件)

StorageEvent 接口由存储事件实现,该事件是 发送到窗口 当窗口有权访问的存储区域在另一个文档的上下文中发生更改时。

1、构造函数

StorageEvent():返回新构造的对象。StorageEvent。

2、实例属性

除了下面列出的属性外,此接口还继承其父接口 Event 的属性。

key:返回一个字符串,该字符串表示已更改的键。 当更改是由存储方法引起的时,该属性为 null。

newValue:返回新值为字符串。storage新增时返回

oldValue:返回一个字符串,为原始的值,此值是新添加时候,返回前一个值。

StorageArea:返回一个 Storage 对象,返回的是一个被改变后的对象,最新状态的对象。

URL:返回包含已更改文档的 URL 的字符串。

3、实例方法

除了下面列出的方法之外,此接口还继承其父接口 Even 的方法。

initStorageEvent()

类似于 DOM 中类似名称的 initEvent()方法的方式初始化事件接口。

4、响应存储的变化

无论何时,Storage对象发生变化时(即创建/更新/删除数据项时,重复设置相同的键值不会触发该事件,Storage.claear() 方法至多触发一次该事件),StorageEvent事件会触发。在同一个页面内发生的改变不会起作用——在相同域名下的其他页面(如一个新标签或 iframe)发生的改变才会起作用。在其他域名下的页面不能访问相同的 Storage 对象。


标签:Web,存储,浏览器,sessionStorage,storage,localStorage,key
From: https://blog.51cto.com/u_15997490/8649261

相关文章

  • 存储虚拟化的写入过程
    虚拟机里面的进程写入一个文件,当然要通过文件系统。整个过程和文件系统过程没有区别。只是到了设备驱动层,我们看到的就不是普通的硬盘驱动了,而是virtio的驱动。virtio的驱动程序代码在Linux操作系统的源代码里面,文件名叫drivers/block/virtio_blk.c。虚拟机里面的virtio的......
  • vue3+vite项目优化静态资源使用云存储
    项目中的问题1.当我们在维护自己的博客或者自己的网站的时候没有特别好的服务器就会响应特别的慢2.当我们项目特别大的时候也会首屏加载特别慢而且vue项目打包后的js文件特别的庞大还要加载各种资源就会特别的卡顿3.当我们项目中用到了一些3D效果各种3D资源部特别的大的时......
  • .NET Core|--调用C++库|--docker环境下让web api应用程序调用C++类库
    前言#前提安装docker环境~启动docker~#多说一句,为什么我要搞这个一个镜像,既包含gcc开发环境,又包含.NET开发环境我的api应用程序是基于.NET写的,但是我的这个api程序,又要调用c++的一些东西,特别是涉及一些画图之类的,所以就需要gcc的开发环境,最终搞了这么一......
  • 记一个Python脚本--将webp图片转jpg格式
    什么是WebP图片格式?如何在线转换WebP格式?我们有时候从互联网上下载图片会发现图片是WebP格式而不是常见的JPEG或者是PNG格式,用自带的图片处理软件无法打开,那么什么是WebP格式呢?我们该如何打开WebP格式的图片文件?需要进行图片处理的时候怎么样才能在线转换WebP格式为常用的JPG格式......
  • 关于解决vue报错"Problems loading reference 'https://schemastore.azurewebsites.ne
    打开setting时会看到有一条三角形的警告信息 看问题描述:无法从该网站加载解决方法:打开设置,找到扩展下的json项 设置之后可以在settings.json文件中看到新增加一项 "json.schemaDownload.enable":false可以直接在界面上设置: "json.schemaDownload.enable":false......
  • Weblogic 常规渗透测试环境
    Weblogic常规渗透测试环境本环境模拟了一个真实的weblogic环境,其后台存在一个弱口令,并且前台存在任意文件读取漏洞。分别通过这两种漏洞,模拟对weblogic场景的渗透。weblogic版本:10.3.6(11g)Java版本:1.6启动本环境:cdweblogic/weak_passworddocker-composeup-d弱口令环......
  • 【直播协议详解】RTMP、HLS、HTTP-FLV、WebRTC、RTSP的区别
    本期我们详细讨论直播的相关协议,包括:HTTP-FLV、HLS、RTMP、Web-RTC、RTSP等等。我们将会详细介绍这些协议的工作原理、应用场景、及延迟的原因。我们按这样的顺序讨论​:RTMP、HTTP-FLVHLSWeb-RTCRTSP一、RTMP、HTTP-FLV协议RTMP和HTTP-FLV都是建立在FLV封装之上的。RTM......
  • .net core(web api) 后台 +uniapp移动端自动更新
    移动端采用uniapp开发后台采用.netcore先到插件市场找到对应的插件  然后将插件安装到 然后在移动端项目pages.json"path":"uni_modules/rt-uni-update/components/rt-uni-update/rt-uni-update","style":{"app-plus":{"......
  • macOS Sonoma 14.1.2 (23B92) 正式版 Boot ISO 原版可引导镜像下载 (Webkit 零日漏洞
    macOSSonoma14.1.2(23B92)正式版BootISO原版可引导镜像下载(Webkit零日漏洞修复)本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。请访问原文链......
  • macOS Sonoma 14.1.2 (23B92 | 23B2091) 正式版发布,ISO、IPSW、PKG 下载 (Webkit 零日
    macOSSonoma14.1.2(23B92|23B2091)正式版发布,ISO、IPSW、PKG下载(Webkit零日漏洞修复)本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。请访问......