如何在ServiceWorker中的响应上设置cookie

时间:2017-06-07 23:17:30

标签: javascript performance service-worker

在页面导航触发的提取处理程序中,我尝试这样做:

return event.respondWith(new Response('Hello!', {
  headers: {
    "Set-Cookie": "TestCookie=foo; path=/; Max-Age=60;"
    "TestHeader": "foo"
  }
}));

然后我在浏览器中加载了任何URL,并得到了“你好!”身体。在Chrome devtools中,我看到网络面板中设置了TestHeader。但是cookie没有显示在网络面板中,也没有出现在应用程序>中。 Cookies查看器。 document.cookie也无法生成它。

请求由页面导航启动,因此无法在浏览器选项卡上设置credentials: "include"

是否可以在ServiceWorker中为响应添加cookie?如果没有,是否可以以任何其他方式编写cookie?

2 个答案:

答案 0 :(得分:2)

Fetch规范中有一些相关信息。

根据https://fetch.spec.whatwg.org/#forbidden-response-header-name

  

禁止响应标头名称是a的标头名称   其中一个的字节大小写不匹配:

     
      
  • Set-Cookie
  •   
  • Set-Cookie2
  •   

然后根据https://fetch.spec.whatwg.org/#concept-headers-append中的第6项:

  

否则,如果guard是“response”且name是禁止的响应头名称,则返回。

添加Set-Cookie标头的限制适用于使用初始标头集构建新的Response对象,或者在事实之后向现有Response对象添加标头。

计划添加对服务工作者内部读取和写入cookie的支持,但这将使用Set-Cookie对象中Response标头以外的机制。有关this GitHub issue中的计划的更多信息。

答案 1 :(得分:0)

您可以尝试以下操作:

async function handleRequest(request) {
    let response = await fetch(request.url, request);       
    // Copy the response so that we can modify headers.
    response = new Response(response.body, response)
    response.headers.set("Set-Cookie", "test=1234");
    return response;
}