简短版本
是否可以在通过 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/