我在我的应用程序上安装了一个服务工作者,它安装得很好,激活得很好,缓存也可以。
但当我点击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
});
});
}
})
);
});
可能的解决办法
对于可能抛出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;
}
...
}
任何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