javascript - 外国来源的索引数据库缓存?

标签 javascript browser-cache indexeddb service-worker same-origin-policy

简短版本

是否可以在通过 importScripts() 导入的脚本的外源下创建索引数据库?

长版

我的目标是能够通过共享服务 worker 在多个应用程序之间共享(indexedDB-)缓存资源。

例如:

//hosted on https://site1.com

<!doctype html>
<html lang="en">
<head></head>
<body>
  <script>
    if ('serviceWorker' in navigator) {
        navigator.serviceWorker.register('/serviceWorker1.js', {scope: ' '}).then(function() {})
    }
  </script>

//serviceWorker1.js

importScripts("https://serviceWorker.com/sw.js");
<小时/>
//hosted on https://site2.com

<!doctype html>
<html lang="en">
<head></head>
<body>
  <script>
    if ('serviceWorker' in navigator) {
        navigator.serviceWorker.register('/serviceWorker2.js', {scope: ' '}).then(function() {})
    }
  </script>

//serviceWorker2.js

importScripts("https://serviceWorker.com/sw.js");
<小时/>
//https://serviceWorker.com/sw.js

self.addEventListener('fetch', function(event) {
  // I wanted indexedDB here to be scoped under https://serviceWorker.com, 
  // not https://site1.com or https://site2.com
});

我已经弄清楚了以下几点:

  • 需要通过 https(或 localhost)从同一源调用 Service Worker
  • 可以通过在(同源)加载的服务工作线程脚本文件中使用 importScripts("https://serviceWorker.com/sw.js ") 将“外来源”服务工作线程加载到您当前的源中。
  • 浏览器沙箱索引数据库基于所谓的“同源策略”,该策略规定只有来自同源元组(方案、URL、端口)的脚本可以在同一缓存上运行。 (https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy)
  • importScripts() 将一个或多个脚本导入到工作线程的作用域中。

我想知道以下内容:

是否可以在通过 importScripts() 导入的脚本的外源下创建索引数据库?

如果是这样,怎么办?如果不是,为什么?

提前致谢。

最佳答案

没有。

组成脚本的字节从何处加载不会影响授予脚本访问资源的权限。例如,在从 http://example.com 加载的页面中,从 http://example.org:1234 加载的脚本与从 http://example.com 加载的脚本具有完全相同的权限;它无法从 http://example.org:1234 获取和检查任意资源不超过从 http://example.com 加载的脚本能。这也适用于存储 API 以及 Web 平台的其他源范围功能。

通常的解决方法是让页面托管来自第二个源的 iframe。框架可以使用 postMessage() 进行通信;托管框架将通信限制在它信任的来源。通常,这种通信会被包装在某种代理中,以便托管页面只能看到异步存储 API。

关于javascript - 外国来源的索引数据库缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48692113/

相关文章:

javascript - 在 React 方法中设置状态

javascript - HTML5 缓存 Javascript 文件以供在线和离线使用

c# - 在 IIS8 中部署时缓存不起作用

javascript - 使用ajax验证表单字段

javascript - 如何使用 javascript 值设置 HTML 输入字段的值

javascript - IndexedDB 和 JavaScript : JSON and objects misunderstanding

javascript - 仅在 IndexedDB 中更新对象后运行代码(特别是在 Chrome 中)

javascript - dexie - 表 <tableName> 不是事务的一部分

javascript - 禁用 CKEditor 4.0 LITE 插件中的特定按钮以跟踪更改

javascript - 将 UrlArgs 添加到 reuire-js 主文件中