nni*_*mis 6 javascript html5 jsp service-worker
我正在尝试从服务工作者那里获取Web服务.此服务是使用基本Apache身份验证保护的JSP,因此我必须提供凭据以在请求标头中进行身份验证.以下请求在主窗口中工作正常:
self.addEventListener('push', function(event) {
console.log('Received a push message', event);
event.waitUntil(
fetch(ONLINE_SITE_ENDPOINT, {
method: 'GET',
mode: 'cors',
headers: {
'Accept': 'application/json',
'Authorization': 'Basic btoa(auth info)'
}
}).then(function(response) {
//process response
}).catch(function(err) {
})
);
});
Run Code Online (Sandbox Code Playgroud)
该代码进入一个event.waitUntil()范围,进入一个从'push'事件监听器调用的函数.但是,同样的确切调用失败了401(未授权).开发人员工具中的"网络"面板显示未发送标头:
OPTIONS /latest-new.jsp HTTP/1.1
Host: {an accessible host}
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://localhost
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36
Access-Control-Request-Headers: accept, authorization
Accept: */*
Referer: http://localhost/service-worker.js
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Run Code Online (Sandbox Code Playgroud)
这里有什么东西不见了吗?或者只是服务工作者无法实现?
一些额外的信息:只是不能使用XMLHttpRequest,因为它在服务工作者范围内是"未定义".检索JSON之前JSP上的标头:
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
Run Code Online (Sandbox Code Playgroud)
更新:肯定会有来自服务工作者的身份验证标头,因为对非安全URL的请求不会失败.没有Apache授权的相同服务按预期工作.
您应该将允许的标头设置为还接受和授权
response.setHeader(
"Access-Control-Allow-Headers",
"x-requested-with, accept, authorization"
);
Run Code Online (Sandbox Code Playgroud)
“OPTIONS”请求的响应正文也应该为空(确实没有必要,但此类响应中没有正文的用例)并且Content-length:应该为 0(零)
请注意,不应将此请求传递给应用程序(可以,但不需要)