当前位置: 首页 > 知识库问答 >
问题:

Service Worker:如何处理302重定向响应

冯永长
2023-03-14

我在我的应用程序上安装了一个服务工作者,它安装得很好,激活得很好,缓存也可以。

但当我点击302页面时,缓存完成后,它会告诉我:

http://localhost:8000/form/的Fetch事件导致网络错误响应:重定向响应用于重定向模式不是“跟随”的请求。

我已经读了很多关于这个主题的文章,我在这里查阅了一些帖子:服务人员破坏301重定向,还有那里https://github.com/w3c/ServiceWorker/issues/737在那里https://github.com/GoogleChromeLabs/sw-precache/issues/220

正如我所理解的,获取时的默认重定向模式是{重定向:“跟随”},但是当我从重定向页面捕获重定向模式时,我可以看到它是{重定向:“手动”}所以基本上,当它是“手动”时,我必须做一些事情。

我想我有点困惑,我正在努力在我的代码中实现这一点。

这是我的代码:

const STATIC_CACHE_NAME = 'exell-static-v28';
const DYNAMIC_CACHE_NAME = 'exell-dynamic-v4';

// INSTALLING THE SERVICE WORKER AND PRECACHING APPSHELL
self.addEventListener('install', function(event) {
  console.log('[Service Worker] Service Worker installed');
  event.waitUntil(
    caches.open(STATIC_CACHE_NAME) // Create a static cache
    .then(function(cache) {
      console.log('[Service Worker] Precaching App Shell');
      cache.addAll([   // Add static files to the cache
        '/',
        '/build/app.js',
        '/build/global.css',
        'login',
        'logout',
        'offline',
        'form/',
        'form/new/first_page',
        'form/new/second_page',
        'form/new/third_page',
        'form/new/fourth_page',
        'form/new/fifth_page',
        'form/new/sixth_page',
        'profile/',
        'build/fonts/BrandonGrotesque-Medium.a989c5b7.otf',
        'build/fonts/BrandonText-Regular.cc4e72bd.otf',
      ]);
    })
  );
});

// ACTIVATING THE SERVICE WORKER
self.addEventListener('activate', function(event) {
  console.log('[Service Worker] Service Worker activated');
  event.waitUntil(
    caches.keys()
    .then(function(keyList) {
      return Promise.all(keyList.map(function(key) {
        if (key !== STATIC_CACHE_NAME && key !== DYNAMIC_CACHE_NAME) { // If old cache exists
          console.log('[Service Worker] Deleting old cache', key);
          return caches.delete(key);  // Delete it and replace by new one
        }
      }));
    })
  );
  return self.clients.claim();
});


// FETCHING
self.addEventListener('fetch', function(event) {

  // Do not waste time with files we don't want to cache
  if (event.request.url.match(/ajax.js/)) {
    return;
  }

  event.respondWith(
    caches.match(event.request) // Retrieve data from the cache
     .then(function(response) {
        if (response) {
          return response;  // If there is a response, return it
        } else {
          return fetch(event.request) // Otherwise fetch from network
            .then(function(res) {
              return caches.open(DYNAMIC_CACHE_NAME)
                .then(function(cache) {
                  cache.put(event.request.url, res.clone()); // Store the response in the dynamic cache
                  return res; // And return the response
                });
            })
            .catch(function() {  // If no network
              return caches.open(STATIC_CACHE_NAME) // Open the static cache
               .then(function(cache) {
                 cache.match('offline'); // Look for the offline default template and return it
               });
            });
         }
      })
    );
});

共有2个答案

令狐昌胤
2023-03-14

可能的解决办法

对于可能抛出3xx的页面...不要缓存东西。https://medium.com/@boopathi/service-workers-getchas-44bec65eab3f

self.addEventListener('fetch', event => {

    // path throw a 3xx - don’t cache
    if(event.request.url == '{{url}}' ) {
        return;
    }

    ...

}
颜骁
2023-03-14

任何30x响应都应该有一个类型属性,该属性解析为“opaqueredirect”,您可以检查该属性,并对其做出适当的反应。也许你想查看这个链接:回复。类型

opaqueredirect:获取请求是通过重定向:“手动”发出的
响应的状态为0,标题为空,正文为空,尾部为空。

因此,要解决您的问题,您应该检查:

response.type === 'opaqueredirect'

而不是任何与response.status相关的检查,例如类似于
(下面的检查将不能作为response.status将是0

response.status === 301 || response.status === 302

干杯,快乐编码!

 类似资料:
  • 我想做什么(在控制器中) 接收请求,根据该请求 发送外部HTTP请求 解析响应,并基于此 回复 我计划有多个函数都遵循这个模式。他们一个接一个地被召唤。 Symfony 4.3引入了HttpClient组件和BrowserKit组件,乍一看似乎符合要求。但事实证明,事情变得更加复杂。外部HTTP请求被发送到一个服务器,该服务器使用cookie跟踪会话,这应该不会太不寻常。如果发送请求时没有cook

  • 问题内容: 我要访问一个首先需要(tomcat服务器)身份验证的站点,然后使用POST请求登录,并保留该用户以查看站点的页面。我使用Httpclient 4.0.1 第一次身份验证可以正常运行,但登录时始终不会抱怨此错误:“ 302临时移动” 我保留cookie并保留上下文,但是什么也没有。实际上,登录似乎可行,因为如果我输入了错误的参数或用户||密码,则会看到登录页面。所以我想自动重定向是行不通

  • 我正在尝试使用SpringREST模板进行post请求以登录。 我的ResponseEntity状态是302,我想按照此请求获取正文响应,因为我没有获取此请求的正文。 我能做些什么来解决这个问题?!

  • 问题内容: 我有一个使用Forms Authentication以asp.netmvc编写的后端服务器。当用户未通过身份验证时,服务器将自动发送302重定向到“登录”操作并返回“登录”页面。 在客户端,我有一个项目列表。只有经过身份验证的用户才能访问此列表。在页面上,我有一个使用Ajax(jQuery的$ .ajax函数)刷新列表的按钮。 现在,我的问题是身份验证票证超时并且用户单击“刷新”按钮时

  • 问题内容: 我正在将一些数据发布到正在回答302移动临时的服务器上。 我希望HttpClient遵循重定向并自动获取新位置,因为我相信这是HttpClient的默认行为。但是,我得到一个例外,而不是按照重定向:( 这是相关的代码,任何想法都将不胜感激: 问题答案: HttpClient的默认行为符合HTTP规范(RFC 2616)的要求 您可以通过子类化DefaultRedirectStrateg

  • 11.7. 处理重定向 你可以使用两种不同的自定义 URL 头信息来处理永久重定向和临时重定向。 首先, 让我们来看看重定向处理的必要性。 例 11.10. 没有重定向处理的情况下,访问 web 服务 >>> import urllib2, httplib >>> httplib.HTTPConnection.debuglevel = 1 >>> request = url