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

Nat*_*oos 152 javascript html5 local-storage

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

Nic*_*ver 173

它是每个域(与相同的原始策略相同的隔离规则),为了使每个页面你必须使用基于location或其他方法的密钥.

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

  • 每个`protocol:// host:port`组合都是唯一的. (64认同)
  • file:/// 协议为每个目录存储单独的变量。 (3认同)
  • www.mysite.it:8012/App1 和 www.mysite.it:8012/App2 共享本地存储吗? (2认同)
  • @ DarioN1是,www.mysite.it:8012 / App1和www.mysite.it:8012/App2已共享本地存储。(注意:如果您从不同的协议(例如EG http vs https)访问它们,则不会共享它们。在同一协议,子域,域和端口中,它们是共享的。这是对“来源”概念的简化。 ) (2认同)

T.J*_*der 19

这些商店是每个来源,其来源与同源政策(模式[ httpvs. https等],端口和主机的组合)相同.从规格:

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

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

Web存储中没有内置机制允许一个源访问另一个源的存储.

需要注意的是它的起源,而不是URL,所以http://example.com/page1http://example.com/page2都具有访问存储的http://example.com.

  • +1提到“网络存储中没有内置机制允许一个源访问另一个源的存储。” (3认同)
  • 这本书写得很好,因为它易于阅读和充分解释,所以最喜欢这个答案,即使对于那些刚开始开发的人也是如此。 (2认同)

seb*_*eli 7

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

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

localStorage.key(0);
Run Code Online (Sandbox Code Playgroud)

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


Mac*_*Mac 6

正如其他人指出的那样,localStorage在每个协议,主机和端口上都是唯一的。如果您希望使用方便的方法来控制带有前缀键的存储,建议您使用localDataStorage

它不仅可以通过前缀键来帮助在同一域中强制执行分段共享存储,还可以透明地存储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
Run Code Online (Sandbox Code Playgroud)

如您所见,原始值受到尊重,并且您可以创建几个实例来控制您的存储。


Ben*_*jol 5

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

  • IMO用户脚本应该避免冲突,而不是页面.在我的用户脚本中,我使用以脚本命名的前缀. (14认同)