【问题标题】:Handle fetch in service worker but allow client to see redirect处理服务工作者中的获取,但允许客户端查看重定向
【发布时间】:2015-07-10 04:11:41
【问题描述】:

我有一个 url,/users/sign_out,应该注销用户并将他们重定向到我的根 url,/。我想通过我的服务工作者来处理这个获取,因为我想在将用户发送回 root 之前从缓存中清除一些项目。但是,由于客户端没有看到在从服务工作者获取时发生的重定向,因此用户在我的初始屏幕上结束了,但看到了预重定向地址 /users/sign_out

目前有什么方法可以让我处理获取并允许客户端查看正确的最终 url?

似乎最终会有一个Response.redirect() 方法允许使用最终网址更新响应。看起来也可能有某种finalURL 选项也可以解决这种情况。但是我现在有什么可以使用的吗?在 Twitter 上,Jake Archibald (@jaffathecake) 说我可以自己构建一个新的响应 - 我可以,但是即使在查看了规范和 MDN 文档之后,我仍然无法弄清楚如何为它。

如果事实上有一种方法可以构造一个满足我需要的 Response 对象,有人可以告诉我它是如何工作的吗?

【问题讨论】:

    标签: service-worker


    【解决方案1】:

    https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/mock-responses 有一个示例,展示了如何创建 Response 对象并使用它来响应 fetch 事件。

    在这种情况下,我们正在创建一个带有正文的 200 OK 响应,但没有什么可以阻止您创建任意响应。您可能需要一个 302 Found 用于您的用例,因此您可以执行以下操作:

    var responseInit = {
      status: 302,
      statusText: 'Found',
      headers: {
        Location: '/' // Or whatever URL you want to redirect to.
      }
    };
    
    var redirectResponse = new Response('', responseInit);
    event.respondWith(redirectResponse);
    

    您可以在响应事件之前在 fetch 处理程序中包含清除缓存的代码,并且您显然希望首先检查 event.request.url 值以确保您只响应对 /users/sign_out 的请求与您的自定义响应。

    【讨论】:

    • 所以这会告诉客户端为/ 进行新的提取,对,所以我最终会提取两次?我理解正确吗?
    • 这应该只是针对 / 的单个 HTTP 请求的结果,它会自动源自您的浏览器以响应 HTTP 302。
    • 我的意思是我会从服务人员那里获取一次/,然后再从浏览器中获取一次以响应服务人员的重定向吗?
    • 无论哪种方式,我都可以使用它,所以我会接受答案。谢谢你的例子。
    • 浏览器在处理HTTP 302的时候会有一个/触发的请求。你的SW的fetch handler是否被那个请求触发取决于SW作用域是否包含/。不会对 / 发出两个真正的 HTTP 请求。
    猜你喜欢
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 2012-07-06
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    相关资源
    最近更新 更多