我正在尝试使用 SharedArrayBuffer,这需要设置 COOP 和 COEP 标头,以便 window.crossOriginIsolated==true。
我已经这样做了,而且效果很好。 但由于我无法详细说明的原因,我可能无法为整个网站设置这些标题。 该网站由 Express JS Web 服务器提供服务,我一直在使用更简单的示例,因此我可以对测试进行无限控制。
在阅读 WorkerGlobalScope 的 MDN 页面时,它提到 crossOriginIsolated (cOI) 是它的一个属性。 目前尚不清楚 WorkerGlobalScope 的 cOI 是否与顶级窗口的 cOI 相关,尽管(特别是在测试之后)我怀疑可能是这种情况。
为了测试,我尝试仅发送子目录 ./dist 下文件的 COOP 和 COEP 标头,以便浏览器通过正确设置这些标头来获取定义工作人员的 JavaScript 文件 - 我已经确认了这一点。
app.use( "/dist/*", ( req, res, next ) => {
console.log( `Requesting file: ${req.baseUrl}` );
res.setHeader("Cross-Origin-Opener-Policy", "same-origin");
res.setHeader("Cross-Origin-Embedder-Policy", "require-corp");
next();
} );
从 Chrome Devtools 的“网络”选项卡:请求网址:http://localhost/dist/mainworker.mjs 请求方式:GET 状态代码:200 正常 推荐人策略:跨源时严格源 。 。 。 内容类型:应用程序/javascript;字符集=UTF-8 跨域嵌入器策略:require-corp 跨域开启策略:同源 但是,WorkerGlobalScope.crossOriginIsolated 是 false。
我的怀疑是否正确 - WorkerGlobalScope.crossOriginIsolated 与顶级窗口有着千丝万缕的联系? 或者是否有人能够创建一个 cOI 为 true 而主选项卡窗口的 cOI 为 false 的 Web Worker?
from django.http import HttpResponse
class CrossOriginIsolationMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# Handle OPTIONS preflight request (for CORS)
if request.method == 'OPTIONS':
response = HttpResponse()
response['Access-Control-Allow-Origin'] = 'http://localhost:3000' # Specify the frontend origin
response['Access-Control-Allow-Credentials'] = 'true'
response['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization'
response['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS, PUT, DELETE'
return response
response = self.get_response(request)
response['Access-Control-Allow-Origin'] = 'http://localhost:3000' response['Access-Control-Allow-Credentials'] = 'true'
response['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization'
response['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS, PUT, DELETE'
if request.path.startswith('/dicomweb/'):
response['Cross-Origin-Opener-Policy'] = 'same-origin'
response['Cross-Origin-Embedder-Policy'] = 'require-corp'
response['Cross-Origin-Resource-Policy'] = 'cross-origin' # Changed to same-origin for better isolation
elif request.path.startswith('/api/'):
response['Cross-Origin-Opener-Policy'] = 'same-origin'
response['Cross-Origin-Embedder-Policy'] = 'require-corp'
response['Cross-Origin-Resource-Policy'] = 'cross-origin'
return response
我的settings.py有
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'main.middleware.CrossOriginIsolationMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'csp.middleware.CSPMiddleware',
]
请帮助将 window.crossOriginIsolated 设置为 true