Javascript 在HTML5中,localStorage对象是按页面/域隔离的吗?
HTML5本地存储对象是否按页面/域隔离?我想知道如何命名localStorage密钥。我需要一个单独的前缀吗?或者我可以随意命名它们吗?它是按域和端口命名的(与相同的隔离规则),要按页面命名,您必须使用基于Javascript 在HTML5中,localStorage对象是按页面/域隔离的吗?,javascript,html,local-storage,Javascript,Html,Local Storage,HTML5本地存储对象是否按页面/域隔离?我想知道如何命名localStorage密钥。我需要一个单独的前缀吗?或者我可以随意命名它们吗?它是按域和端口命名的(与相同的隔离规则),要按页面命名,您必须使用基于位置的键或其他方法 你不需要前缀,但是如果你需要的话可以使用前缀。此外,是的,您可以随意命名它们。是的,每个域/子域都有一个不同的localStorage,您可以随意调用键(不需要前缀) 要获取键,可以使用方法键(索引),例如 以前有一个名为globalStorage的对象,您可以在其中拥有
位置的键或其他方法
你不需要前缀,但是如果你需要的话可以使用前缀。此外,是的,您可以随意命名它们。是的,每个域/子域都有一个不同的localStorage,您可以随意调用键(不需要前缀)
要获取键,可以使用方法键(索引),例如
以前有一个名为globalStorage的对象,您可以在其中拥有多个本地存储,但它已从规范中弃用正如Nick所建议的,它在该域的任何位置都可用,作为替代方案,sessionStorage的工作原理略有不同,因为它与浏览器窗口本身不同。也就是说,同一域上的其他选项卡或窗口无权访问存储对象的同一副本。存储是按源的,其中“源”与(架构[http
vs.https
等]、端口和主机的组合)相同。发件人:
每个顶级浏览上下文都有一组唯一的会话存储区域,每个源一个
因此,http://a.example.com
和http://b.example.com
是独立的(并且它们都与http://example.com
)因为这些都是不同的主机。类似地,http://example.com:80
和http://example.com:8080
和https://example.com
都是不同的来源
web存储中没有内置机制允许一个来源访问另一个来源的存储
请注意,它是源代码,而不是URL,因此http://example.com/page1
和http://example.com/page2
两者都可以访问http://example.com
正如其他人所指出的,本地存储在协议、主机和端口上都是唯一的。我建议,如果你想用一种简便的方法来控制带有前缀键的存储空间
它不仅通过为键添加前缀来帮助在同一域内实施分段共享存储,还透明地存储javascript数据类型(数组、布尔值、日期、浮点值、整数、字符串和对象),提供轻量级数据混淆,自动压缩字符串,并方便按键(名称)和按键(键)查询价值观
[免责声明]我是实用程序的作者[/免责声明]
示例:
// instantiate our first storage object
// internally, all keys will use the specified prefix, i.e. passphrase.life
var localData = localDataStorage( 'passphrase.life' );
localData.set( 'key1', 'Belgian' )
localData.set( 'key2', 1200.0047 )
localData.set( 'key3', true )
localData.set( 'key4', { 'RSK' : [1,'3',5,'7',9] } )
localData.set( 'key5', null )
localData.get( 'key1' ) --> 'Belgian'
localData.get( 'key2' ) --> 1200.0047
localData.get( 'key3' ) --> true
localData.get( 'key4' ) --> Object {RSK: Array(5)}
localData.get( 'key5' ) --> null
// instantiate our second storage object
// internally, all keys will use the specified prefix, i.e. prismcipher.com
var localData2 = localDataStorage( 'prismcipher.com' );
localData2.set( 'key1', 123456789 ) // integer
localData2.get( 'key1' ) --> 123456789
如您所见,基本值是受尊重的,您可以创建多个实例来控制存储。每个protocol://host:port
composition.www.mysite.it:8012/App1和www.mysite.it:8012/App2共享本地存储?@DarioN1是的,www.mysite.it:8012/App1和www.mysite.it:8012/App2共享本地存储。(注意:如果您从不同的协议访问它们,例如http与https,则它们不会共享。在同一协议中,子域、域和端口--它们是共享的。这是对“源”概念的简化。)文件:///协议为每个目录分别存储变量。这是一篇很棒的文章,我最喜欢这个答案,因为它易于阅读和充分解释,即使对于那些刚开始开发的人来说也是如此。+1提到“web存储中没有内置机制允许一个来源访问另一个来源的存储。”我总是使用前缀,只是为了避免与用户脚本的潜在冲突,用户脚本也可能使用localStorage.IMO应该避免冲突的是用户脚本,而不是页面。在我的用户脚本中,我使用了以脚本命名的前缀。
// instantiate our first storage object
// internally, all keys will use the specified prefix, i.e. passphrase.life
var localData = localDataStorage( 'passphrase.life' );
localData.set( 'key1', 'Belgian' )
localData.set( 'key2', 1200.0047 )
localData.set( 'key3', true )
localData.set( 'key4', { 'RSK' : [1,'3',5,'7',9] } )
localData.set( 'key5', null )
localData.get( 'key1' ) --> 'Belgian'
localData.get( 'key2' ) --> 1200.0047
localData.get( 'key3' ) --> true
localData.get( 'key4' ) --> Object {RSK: Array(5)}
localData.get( 'key5' ) --> null
// instantiate our second storage object
// internally, all keys will use the specified prefix, i.e. prismcipher.com
var localData2 = localDataStorage( 'prismcipher.com' );
localData2.set( 'key1', 123456789 ) // integer
localData2.get( 'key1' ) --> 123456789