Javascript 在HTML5中,localStorage对象是按页面/域隔离的吗?

Javascript 在HTML5中,localStorage对象是按页面/域隔离的吗?,javascript,html,local-storage,Javascript,Html,Local Storage,HTML5本地存储对象是否按页面/域隔离?我想知道如何命名localStorage密钥。我需要一个单独的前缀吗?或者我可以随意命名它们吗?它是按域和端口命名的(与相同的隔离规则),要按页面命名,您必须使用基于位置的键或其他方法 你不需要前缀,但是如果你需要的话可以使用前缀。此外,是的,您可以随意命名它们。是的,每个域/子域都有一个不同的localStorage,您可以随意调用键(不需要前缀) 要获取键,可以使用方法键(索引),例如 以前有一个名为globalStorage的对象,您可以在其中拥有

HTML5本地存储对象是否按页面/域隔离?我想知道如何命名localStorage密钥。我需要一个单独的前缀吗?或者我可以随意命名它们吗?

它是按域和端口命名的(与相同的隔离规则),要按页面命名,您必须使用基于
位置的键或其他方法


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

是的,每个域/子域都有一个不同的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