pwa的安全上下文是强制运行前提,必须通过https或localhost满足,javascript无法伪造,只能检测与适配;service worker、notification、geolocation等api仅在安全上下文中可用,否则注册失败并报错。

PWA 的安全上下文不是“配置”出来的,而是必须满足的运行前提——它由协议、域名和浏览器规则共同决定。JavaScript 本身不能绕过或伪造这个环境,但可以通过检测、防护和适配来确保 PWA 在合规的安全上下文中启动和运行。
必须用 HTTPS(或 localhost)提供服务
浏览器只允许在安全上下文中注册 Service Worker、调用 Notification API、使用 Geolocation 或 Push 等关键能力。HTTP 域名(如 http://example.com)会直接拒绝注册,控制台报错:Failed to register a ServiceWorker: The document is in an insecure context.
✅ 正确做法:
- 生产环境强制启用 HTTPS(推荐 Let’s Encrypt 免费证书)
- 开发时仅用
http://localhost:3000(注意:http://127.0.0.1:3000在部分旧版 Chrome 中不被识别为安全上下文) - 确保
sw.js和manifest.json可通过 HTTPS 直接访问(返回 HTTP 200,且 MIME 类型正确)
注册前做协议检查,避免静默失败
不要无条件调用 navigator.serviceWorker.register(),先确认当前页面是否处于安全上下文:
if ('serviceWorker' in navigator && location.protocol === 'https:') {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js')
.then(reg => console.log('SW registered:', reg.scope))
.catch(err => console.error('SW registration failed:', err));
});
} else if (location.hostname === 'localhost') {
// 开发环境允许 localhost(即使 http://)
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js');
});
} else {
console.warn('PWA features disabled: not in secure context');
}
防止 Service Worker 被劫持或注入
Service Worker 拥有请求拦截权,一旦被恶意覆盖,整个缓存和响应都可能被篡改。因此:
- 所有 SW 脚本必须通过 HTTPS 加载(包括内联
<script></script>动态生成也不行) - 避免拼接路径或动态
importScripts(),使用固定、可审计的脚本路径(如/sw.js) - 在服务器端设置严格的内容安全策略(CSP),例如:
Content-Security-Policy: script-src 'self'; object-src 'none'; base-uri 'self';
Manifest 文件也需同源且 HTTPS 加载<link rel="manifest" href="/manifest.json"> 中的 href 必须是同源 HTTPS URL(开发时 localhost 除外)。若 manifest 返回 404 或跨域,添加到主屏幕功能将失效,且部分浏览器会忽略安装提示。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
额外防护:检查当前上下文是否真正“安全”
现代浏览器提供 isSecureContext 全局属性,可用于细粒度判断:
if (!window.isSecureContext) {
// 即使是 localhost,某些沙箱环境也可能返回 false
console.warn('Current context is not secure — PWA APIs may be unavailable');
// 可降级:隐藏安装按钮、禁用通知请求等
}
本质上,安全上下文是浏览器强制执行的底层约束,JavaScript 的作用是尊重它、检测它、适配它,而不是“配置”它。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










