const CACHE = 'v2'; const LOGIN = '/login'; const EXPIRE_MS = 3 * 60 * 60 * 1000; self.addEventListener('install', () => self.skipWaiting()); self.addEventListener('activate', e => e.waitUntil(self.clients.claim())); self.addEventListener('fetch', e => { const req = e.request; const url = new URL(req.url); // 登录页、静态资源不拦截 if (url.pathname === '/login' || url.pathname.startsWith('/_next/') || url.pathname.endsWith('.js') || url.pathname.endsWith('.css') || url.pathname.endsWith('.ico') || url.pathname.endsWith('.woff2')) { e.respondWith(fetch(req)); return; } e.respondWith((async () => { const token = self.__auth_token; const tokenTime = self.__auth_time || 0; const isApi = url.pathname.startsWith('/api/'); // 无 token 且不是 API 请求 → 跳转登录 if (!token || (Date.now() - tokenTime > EXPIRE_MS)) { if (!isApi) { self.__auth_token = null; self.__auth_time = 0; return Response.redirect(LOGIN, 302); } // API 请求无 token,直接发(让 API 自己返回 401) return fetch(req); } // 添加认证头 const headers = new Headers(req.headers); headers.set('X-Auth-User', token); const res = await fetch(new Request(req, { headers })); // 非 API 请求 401 → 跳转登录 if (res.status === 401 && !isApi) { self.__auth_token = null; self.__auth_time = 0; return Response.redirect(LOGIN, 302); } return res; })()); }); self.addEventListener('message', e => { if (e.data && e.data.type === 'SET_TOKEN') { self.__auth_token = e.data.token; self.__auth_time = Date.now(); } if (e.data && e.data.type === 'CLEAR_TOKEN') { self.__auth_token = null; self.__auth_time = 0; } });