cookie和localstorage在iframe中的应用

文章讨论了一个用户中心系统中使用iframe集成不同项目页面的问题。由于多个项目共享同一token,最初使用localstorage存储,但发现关闭浏览器后仍能访问,不符合需求。改为使用cookie解决,但在父子页面域名不一致时遇到跨域限制,导致设置cookie失败。当域名或端口号一致时,cookie设置则不受影响。文章探讨了iframe下的跨域安全策略和cookie应用限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景: 现有项目中有一个用户中心系统,里面用iframe嵌入不同项目的页面,多个项目公用一个token

解决方案: 子页面通过url参数的方式传递token, 在url拿到token之后,刚开始将token存入localstorage中,但localstorage是永久保存,在浏览器关掉之后,再重新打开页面,只要token没有过期,页面依旧可以正常打开,这样是不符合需求的。后来将子页面的token存入cookie中来解决这个问题。

当父子页面域名不一致时,例如:父页面为localhost, 子页面为服务器的一个IP, 当把url传递的token存在localstorage时,页面访问正常,未报任何关于跨域的错误,但当把url传递的token存在cookie时,页面无法访问,报错 Unsafe attempt to initiatenavigation for frame with origin 'xxxx' from frame with URL 'xxxxxxx'. The frame attemptingnavigation is targeting its top-level window, but is neither same-origin withits target nor has it received a user gesture. See https://www.chromestatus.com/feature/5851021045661696.

当通过hosts文件将本地IP映射到域名进行测试时

发现父子页面的一级域名一致时,例如,父页面为xx.test.com,子页面为xxxx.test.com, 当把url传递的token存在cookie时,页面访问正常

所以当iframe的父子页面域名不一致时,由于跨域导致set cookie不成功

当iframe的父子页面IP一致,端口号不一致时,在set cookie会同时set 到父子页面

当iframe的父子页面一级域名一致时,在set cookie会同时set 到父子页面

### JavaScript 中 `localStorage` 报错的解决方案 在 JavaScript 开发中,当尝试使用 `localStorage` 时可能会遇到各种错误。这些错误通常源于以下几个原因: #### 原因分析 1. **环境问题**: 如果代码运行在无浏览器环境中(如 Node.js 或服务端渲染),则无法访问 `window.localStorage` 对象[^4]。 2. **跨域限制**: 当前页面被加载到 iframe 中,并且该 iframe 的域名与父窗口不同,则可能由于安全策略而阻止对 `localStorage` 的访问[^5]。 3. **私有模式或禁用存储功能**: 用户设备上的某些设置可能导致 `localStorage` 被禁用,例如浏览器隐私模式下的行为差异[^1]。 --- #### 解决方案 ##### 方法一:检测并优雅降级 在调用 `localStorage` 之前先验证其是否存在以及是否可用: ```javascript if (typeof window !== 'undefined' && window.localStorage) { try { const testKey = '__test__'; window.localStorage.setItem(testKey, 'value'); window.localStorage.removeItem(testKey); console.log('Local Storage 可用'); } catch (error) { console.error('Local Storage 不可用:', error.message); } } else { console.warn('当前环境下未定义 Local Storage'); } ``` 此方法通过捕获异常来判断是否有权限操作 `localStorage`。 --- ##### 方法二:使用 Cookie 替代 如果目标平台不支持 `localStorage`,可以考虑改用 `Cookie` 来实现数据持久化。对于 Nuxt.js 等框架中的 SSR 场景尤为适用[^2]: ```javascript // 安装依赖库 npm install --save cookie-universal-nuxt // 配置 nuxt.config.js export default { modules: ['cookie-universal-nuxt'] } // 使用方式 this.$cookies.set('key', 'value'); // 设置值 const value = this.$cookies.get('key'); // 获取值 ``` 这种方法解决了服务端渲染过程中无法直接访问客户端特性的难题。 --- ##### 方法三:监听变化处理逻辑冲突 有时应用需要动态响应 `localStorage` 数据的变化,在 Vue.js 应用程序中可以通过组合计算属性观察者完成这一需求[^3]: ```javascript computed: { lonlat() { return JSON.parse(localStorage.getItem('lonlat')) || {}; }, }, watch: { lonlat(newVal, oldVal) { if (newVal !== oldVal) { console.log('LonLat 已更新:', newVal); } }, }, created() { window.addEventListener('storage', () => { this.lonlat = JSON.parse(localStorage.getItem('lonlat')); }); } ``` 上述代码片段展示了如何利用事件机制同步多标签页间的状态变更通知。 --- ##### 方法四:适配鸿蒙系统特性 针对 HarmonyOS 平台开发的应用需要注意的是,默认情况下各 Ability 之间并不共享同一份本地储存空间。因此需显式创建实例传递给子组件: ```typescript import UIAbility from '@ohos.app.ability.UIAbility'; import window from '@ohos.window'; class EntryAbility extends UIAbility { private storage = new LocalStorage({ PropA: 47 }); onWindowStageCreate(windowStage: WindowStage): void { windowStage.loadContent('pages/Index', this.storage); } } ``` 这样能够确保所有模块都能正常读写统一的数据源。 --- ### 总结 以上四种途径分别对应不同的实际应用场景技术栈特点,开发者应依据具体业务场景选取最合适的手段规避潜在风险。无论采取何种措施都务必做好兼容性健壮性测试工作以保障用户体验一致性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值