HTML5本地存储与会话存储


560

除了是非持久性的并且仅限于当前窗口之外,会话存储与本地存储相比是否还有其他好处(性能,数据访问等)?


15
@robert-我相信你是错误的。在w3.org/TR/webstorage中, sessionStorage的作用域是“顶级浏览上下文”,这意味着它对于每个浏览器选项卡/窗口都是唯一的。但是,localStorage的范围仅限于原点,这意味着它在同一原点的所有页面之间共享。
broofa


Answers:


811

localStoragesessionStorage都扩展了Storage。除了的预期的“非持久性”外,它们之间没有任何区别sessionStorage

也就是说,存储在中的数据将localStorage 一直保留到明确删除为止。所做的更改将被保存,并且可用于当前和将来对该站点的所有访问。

对于sessionStorage更改仅在每个选项卡上可用。所做的更改将保存并在该选项卡中可用于当前页面直到关闭为止。一旦关闭,存储的数据将被删除。


17
:有一个更广泛的讨论,你会发现这里有帮助stackoverflow.com/questions/19867599/...
埃德·赛克斯

13
如果保存在HTTP下存储一些数据,您将无法在HTTPS进行检索
马克添

我在Chrome v41.x上对此进行了测试,似乎上述有关https的说法不正确:localStorage保留其存储的数据。
CCC

36
SessionStorage在页面重新加载和还原后仍然存在,但是打开新的选项卡/窗口将启动新的会话。
Patrick Patrick

160

唯一的区别是localStorage的到期时间不同,sessionStorage只能在打开它的窗口打开时才能访问。
localStorage持续到您删除它或用户删除它为止。
比方说,你想保存登录用户名和密码,您可能需要使用sessionStorage超过localStorage出于安全原因(即另一人在以后的时间访问他们的帐户)。
但是,如果您想将用户的设置保存在他们的计算机上,则可能需要这样做localStorage。总而言之:

localStorage-长期使用。
sessionStorage-当您需要存储变化或临时的东西时使用


103

其他几点可能有助于理解本地存储和会话存储之间的差异

  1. 本地存储和会话存储都限于文档来源,因此

    https://mydomain.com/
    http://mydomain.com/
    https://mydomain.com:8080/

    以上所有URL均不会共享同一存储空间。(网页的通知路径不会影响网络存储)

  2. 即使在不同选项卡中打开了相同原始策略的文档,会话存储也有所不同,因此在两个不同选项卡中打开的同一网页无法共享相同的会话存储。

  3. 本地存储和会话存储也受浏览器供应商的限制。因此,Chrome或FF无法读取IE保存的存储数据。

希望这可以帮助。


3
否,http和https之间共享相同的sessionStorage,但不是localStorage。
沙阿达特(Shahdat)2013年

5
如果您首先在https来源中设置sessionStorage,它将在http中可用,但是如果您在http中创建sessionStore,则将在http中不可用
Shahdat

4
@Shahdat,您的意思是“然后将无法在https中使用”(注意s)?
Daniel Werner

3
@DanielWerner是的,如果您在http中创建sessionStore,那么https中将不可用。
沙阿达特(Shahdat)'17

28

之间的主要区别localStoragesessionStoragesessionStorage为每个标签是唯一的。如果您关闭标签,则会sessionStorage删除该标签,localStorage则不会。您也无法在标签之间进行通信:)

另一个细微的区别是,例如在Safari(8.0.3)localStorage具有2551个ķ字符的限制,但sessionStorage具有无限的存储

在Chrome(v43)上localStoragesessionStorage被限制为5101个ķ字符(正常/无痕模式之间没有差别)

在Firefox localStoragesessionStorage限制为5120 k个字符(正常/私有模式之间没有区别)

速度没有任何区别:)

移动Safari和移动Chrome也存在问题,专用模式Safari和Chrome的最大空间为0KB


1
限制为5101 k个字符?如此。510.1万个字符?
Zze

@Zze是的,通常1个字符为1个字节,因此500万个字符的存储容量为5Mb。
Basim Khajwal,

@BasimKhajwal那是5MB。字节,而不是位。
雪人

能否请您在提及的内容中添加来源?
Mukus '18

@Mukus,没有源,我对自己进行了测试,并发现私有模式Safari存在localStorage的问题,但是那里没有空间,并且由于localStorage存在,我的polyfill不会触发,但是脚本失败了,因为它无法存储那里有什么。您也可以使用此工具进行测试-dev-test.nemikor.com/web-storage/support-test
Eek


10

在性能方面,我的(粗略)测量发现1000次读写没有区别

从安全性的角度来看,直觉上看来localStore可能在sessionStore之前关闭了,但是没有具体的证据-也许有人这样做吗?

在功能上明智,与上面的digitalFresh相同


1
关于页面加载性能:sessionStorage和localStorage都在页面加载-渲染周期之外启动和填充。因此,无法从浏览器内部测量初始页面加载时间的费用。
Mirko

6

Ya会话存储和本地存储的行为相同,只是本地存储将存储数据,直到并且除非用户删除缓存,并且cookie和会话存储数据将保留在系统中,直到我们关闭会话,即直到我们关闭为止。会话存储创建窗口。


5

我认为,会话存储相对于本地存储的优势在于,它在Firefox中具有无限的容量,并且持续时间不会超过会话。(当然,这取决于您的目标。)


2

本地存储:一直存储用户信息数据,没有到期日期。当用户关闭浏览器窗口时,该数据将不会被删除,它将在日,周,月和年可用。

//Set the value in a local storage object
localStorage.setItem('name', myName);

//Get the value from storage object
localStorage.getItem('name');

//Delete the value from local storage object
localStorage.removeItem(name);//Delete specifice obeject from local storege
localStorage.clear();//Delete all from local storege

会话存储:它与本地存储日期相同,不同之处在于它将在Web用户关闭浏览器窗口时删除所有窗口。

//set the value to a object in session storege
sessionStorage.myNameInSession = "Krishna";

阅读更多请点击


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.