【问题标题】:HTML5 localStorage size limit for subdomains子域的 HTML5 localStorage 大小限制
【发布时间】:2011-02-14 09:26:01
【问题描述】:

HTML5 的 localStorage 数据库通常是有大小限制的——标准大小是每个域 5 或 10 MB。子域能否绕过这些限制(例如 example.com、hack1.example.com 和 hack2.example.com 都有自己的 5 MB 数据库)?标准中是否有任何内容指定父域是否可以访问其子域的数据库?我找不到任何东西,我可以看到任何一种方式的论据,但似乎必须有一些标准模型。

【问题讨论】:

  • 我现在正在使用一个程序,我们试图将所有文本完全存储在 localStorage 中。如果您可以添加一些链接到您找到有关当前 5MB 限制的信息的位置,那就太棒了。这将帮助我更好地理解替代方案。谢谢
  • 基于 Webkit 的浏览器使用 UTF-16 进行存储,限制为 2.5MB。
  • 请注意,2011 年 6 月的 RFC 表示“用户代理应防止将数据存储在其他附属站点的来源下的站点,例如在 a1.example.com、a2.example.com 中存储的数据达到限制, a3.example.com 等,绕过主要的 example.com 存储限制。”所以不要指望那个黑客在未来继续工作。 (dev.w3.org/html5/webstorage)
  • 限制可以通过使用压缩来人为地“扩展”很多。快速算法可以安全使用,例如我的:pieroxy.net/blog/pages/lz-string/index.html
  • 已经完成了一些研究:computerworld.com/s/article/9237259/… 但是,问题是,com.de 或 org.pl 等二级顶级域呢?

标签: html subdomain limit local-storage


【解决方案1】:

要获得 50MB 的存储空间,请使用以下代码

// 1. paste this line in your code
!function(){function e(t,o){return n?void(n.transaction("s").objectStore("s").get(t).onsuccess=function(e){var t=e.target.result&&e.target.result.v||null;o(t)}):void setTimeout(function(){e(t,o)},100)}var t=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;if(!t)return void console.error("indexDB not supported");var n,o={k:"",v:""},r=t.open("d2",1);r.onsuccess=function(e){n=this.result},r.onerror=function(e){console.error("indexedDB request error"),console.log(e)},r.onupgradeneeded=function(e){n=null;var t=e.target.result.createObjectStore("s",{keyPath:"k"});t.transaction.oncomplete=function(e){n=e.target.db}},window.ldb={get:e,set:function(e,t){o.k=e,o.v=t,n.transaction("s","readwrite").objectStore("s").put(o)}}}();

// 2. Setting values
ldb.set('nameGoesHere', 'value goes here');

// 3. Getting values - callback is required because the data is being retrieved asynchronously:
ldb.get('nameGoesHere', function (value) {
  console.log('And the value is', value);
});

来源https://github.com/DVLP/localStorageDB

【讨论】:

    【解决方案2】:

    更好的解决方案是使用[HTML5 IndexedDB 进行离线存储]1

    看起来旧的 Web SQL 的替代品(它似乎被错误地命名为 b/c 它是 offline 存储)是:Indexed DB,它允许离线存储并且仍然受支持:

    IndexedDB 是 HTML5 中的新内容。 Web 数据库是托管和持久化的 在用户的浏览器中。通过允许开发人员创建应用程序 凭借丰富的查询能力,可以设想一种新型的网络 将出现能够在线工作的应用程序 离线

    更多信息和test-apphttp://ido-green.appspot.com/WebSQL-IndexedDB-example/jqm_indexedDB.html

    【讨论】:

    • 目前在移动设备上不支持 IndexedDB(可能在 iOS 7 中即将推出)。因此,最好创建一个包含 WebSQL 和 IndexedDB 的持久性 api,直到在移动设备上更好地支持 IndexedDB caniuse.com/#search=indexeddb
    • 这应该是一条评论,因为它没有回答问题。
    • 我实际上认为它可能会为提出最初问题的人提供最好的建议。另外,还有一个不错的 polyfill 库,它在 WebSQL 之上为旧的移动浏览器实现 indexedDB。
    【解决方案3】:

    来自http://dev.w3.org/html5/webstorage/#disk-space

    建议对每个源设置 5 兆字节的任意限制。欢迎提供实施反馈,并将用于在未来更新此建议。

    它还提到:

    用户代理应防止网站在源下存储数据 其他附属网站,例如存储到极限 a1.example.com、a2.example.com、a3.example.com 等,绕过 主要 example.com 存储限制。

    【讨论】:

    • 这并不能真正回答有关子域的问题。
    • @JörnZaefferer,规范的意图是为了防止使用子域。
    • 有趣的是,尽管规范中有警告,但显然只有 FireFox 实施了建议的预防措施。请参阅此项目以获取填充磁盘/崩溃浏览器的有趣方式:feross.org/fill-disk
    【解决方案4】:

    这是一个非常详细的测试结果,涵盖了大量桌面和移动浏览器:http://dev-test.nemikor.com/web-storage/support-test/

    确认此错误报告:http://code.google.com/p/chromium/issues/detail?id=58985#c15

    根据可以存储的字符串长度,您只能依赖 2.5MB,而不是 5MB。

    【讨论】:

      【解决方案5】:

      当我问“Is 5MB the de facto limit for W3C Web Storage?”时,我错过了这个问题,但我得到的答案基本相同。如果您想了解更多信息,我确实在我的问题中链接到了一些特定于浏览器的限制。

      【讨论】:

        猜你喜欢
        • 2012-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多