在HTML5中,每页/域是否隔离了localStorage对象?

时间:2010-11-17 03:33:57

标签: javascript html5 local-storage

每页/域是否隔离了HTML5 localStorage对象?我想知道因为我将如何命名localStorage键。我需要一个单独的前缀吗?或者我可以将它们命名为我想要的任何东西吗?

6 个答案:

答案 0 :(得分:164)

这是每个域(与same origin policy相同的隔离规则),要使每页显示您必须使用基于location的密钥或其他方法。

您不需要需要前缀,但如果您需要,请使用一个前缀。此外,是的,你可以随意命名。

答案 1 :(得分:13)

商店每个来源,其中的来源与Same Origin Policy(模式[httphttps的组合等)相同。 ],端口和主机)。来自the spec

  

每个顶级浏览上下文都有一组唯一的会话存储区域,每个区域对应一个来源。

因此,http://a.example.com的存储和http://b.example.com的存储是分开的(并且它们都与http://stackoverflow.com分开),因为它们都是不同的主机。同样,http://example.com:80http://example.com:8080以及https://example.com都是不同的来源。

网络存储中没有内置机制允许一个来源访问另一个来源的存储。

请注意,它的来源,而不是网址,因此http://example.com/page1http://example.com/page2都可以访问http://example.com的存储空间。

答案 2 :(得分:7)

是的,每个域/子域都有不同的 localStorage ,您可以随意调用密钥(不需要前缀)。

要获取密钥,您可以使用方法键(索引),例如

localStorage.key(0);

在您可以拥有多个localStorage之前,有一个名为 globalStorage 的对象,但它已从规范中弃用

答案 3 :(得分:5)

我总是使用前缀,只是为了避免与用户脚本的潜在冲突 - 也可以使用localStorage。

答案 4 :(得分:4)

正如其他人所指出的那样,localStorage对于每个协议都是唯一的,主机&港口。如果您想要一种方便的方法来使用前缀键来控制存储空间,我建议localDataStorage

它不仅通过为键添加前缀来帮助在同一域内强制执行分段共享存储,还透明地存储javascript数据类型(Array,Boolean,Date,Float,Integer,String和Object),提供轻量级数据混淆,自动压缩字符串,便于按键(名称)查询以及按(键)值查询。

[免责声明]我是该实用程序的作者[/ DISCLAIMER]

示例:

// 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

如您所见,原始值得到尊重,您可以创建多个实例来控制存储。

答案 5 :(得分:0)

它可以在Nick建议的那个域上的任何地方使用,作为替代方案,sessionStorage的工作方式略有不同,因为它与浏览器窗口本身不同。也就是说,同一域上的其他选项卡或窗口无法访问存储对象的同一副本。