我已在正在开发的应用程序上设置了基本服务工作者安装。
当用户注销并使用其他用户名登录时,此服务工作者会引起很多问题。甚至有时它会阻止登录。
我基本上知道发生了什么事,只是不知道如何解决。
因此,我的应用程序仅适用于登录用户,因此,未经授权的用户只能查看登录页面。
我的第一个问题是,当用户登录时,“仪表板”页面将被缓存,如果他们退出登录并以其他用途登录,则会显示第一个用户的仪表板。 (它在页面顶部显示了错误的用户名)
第二个问题是,有时登录页面会以某种方式缓存,即使用户成功登录,登录页面也会不断将用户重定向回登录页面。
一旦用户执行ctrl + f5
,所有这些问题都将得到完全解决,因为它不使用缓存并直接从网络获取所有内容。
这是我的sw.js
文件:
importScripts( '/cache-polyfill.js' );
var CACHE_NAME = 'XYZ-cache-v0.4.16';
var assetsToCache = [
// A list of CSS, JS, Images and font files
];
self.addEventListener( 'install', event => {
event.waitUntil(
caches.open(CACHE_NAME).then(cache => cache.addAll(assetsToCache))
);
});
self.addEventListener('activate', async (e) => {
e.waitUntil(
caches.keys().then((keyList) => {
return Promise.all(keyList.map((key) => {
if(CACHE_NAME.indexOf(key) === -1) {
return caches.delete(key);
}
}));
})
);
});
self.addEventListener('fetch', (e) => {
e.respondWith(
caches.match(e.request).then((r) => {
return r || fetch(e.request).then((response) => {
return caches.open(CACHE_NAME).then((cache) => {
cache.put(e.request, response.clone());
return response;
});
});
})
);
});
答案 0 :(得分:0)
好吧,首先应该考虑缓存PII(https://en.wikipedia.org/wiki/Personal_data)是否明智。如果那是您真正需要的,那么您应该实现一种机制,以在第一个用户的会话到期时清空缓存。
注销时,您可以使用postMessage API
(https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage)将消息发送给Service Worker。然后,在Service Worker中,具有一些清空缓存的功能。
仅此一项-当用户具体单击“注销”时清空缓存-很可能还不够。登录会话通常限于某个时间范围,因此,即使用户没有单击注销,您也需要具有检测会话结束时间然后清除缓存的逻辑。
也许根本不应该缓存登录页面-如果没有连接,登录页面就无法工作,对吗?
答案 1 :(得分:0)
我的应用遇到了同样的问题。在我的情况下,从sw.js的缓存文件列表中删除我的主页以及清除浏览器中的cahe很有帮助。