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 到父子页面

<think>嗯,用户想了解如何使用iframepostMessage()在不同域下的localStorage中写入token。这个问题我之前接触过,可能涉及到跨域通信的问题。首先,我需要回忆一下浏览器的同源策略,因为不同域的页面之间默认是不能互相访问的,比如localStorage受同源限制,不能直接操作其他域的存储。 那用户的需求是主站A需要将token写入到域B的localStorage中。这时候,常规的方法肯定行不通,所以想到用iframepostMessage的组合。iframe可以嵌入另一个域的页面,而postMessage允许不同窗口之间进行安全的数据传递。 接下来,我应该分步骤来考虑。首先,主站A需要创建一个隐藏的iframe,指向域B的一个特定页面,比如一个专门用来接收token的页面。然后,主站A通过postMessage发送token给这个iframe。域B的页面监听message事件,接收到token后,将其存入自己的localStorage中。 不过需要注意安全性问题,比如在postMessage中要指定目标域为B,避免恶意网站拦截消息。同时,接收方也应该验证消息的来源域是否是预期的A域,防止恶意攻击。 可能的步骤是: 1. 主站A创建iframe,src指向域B的某个处理页面。 2. iframe加载完成后,主站A用postMessage发送token,目标origin设置为域B。 3. 域B的页面监听message事件,验证发送方的域是否是A,然后取出token存入localStorage。 但这里有个问题,iframe的加载可能需要时间,所以主站A需要在iframe的onload事件触发后再发送消息,否则可能发送失败。此外,如果域B的处理页面没有正确设置事件监听,或者权限问题,也可能导致失败。 另外,用户可能需要考虑浏览器兼容性,postMessage的支持情况,但现在主流浏览器应该都支持了。还有,localStorage的容量限制是否被禁用的情况,不过这可能不是当前问题的重点。 总结下来,关键点在于跨域通信的安全性正确的时机,确保消息在iframe加载完成后发送,接收方验证来源,安全存储token。可能需要编写示例代码来说明这个过程,比如主站A的代码域B处理页面的代码结构。 同时,还要提醒用户注意安全风险,比如确保只有合法的域才能发送接收消息,避免XSS攻击。另外,如果token非常敏感,可能需要其他安全措施,比如HTTPS,或者考虑其他存储方式如HttpOnly的Cookie,但用户的需求明确是localStorage,所以按照这个方向回答。</think>使用 `iframe` 结合 `postMessage()` 是实现跨域将数据(如 `token`)写入不同域下的 `localStorage` 的常见方案,核心思路是通过跨域通信将数据传递给目标域,再由目标域自行写入自己的存储。以下是具体实现步骤注意事项: --- ### **实现原理** 1. **主页面(域A)**:通过 `<iframe>` 嵌入一个属于**目标域B**的页面。 2. **跨域通信**:主页面使用 `postMessage()` 向 `iframe` 发送 `token` 数据。 3. **目标页面(域B)**:监听 `message` 事件,接收数据并写入自己的 `localStorage`。 --- ### **代码示例** #### 1. 主页面(域A)的代码 ```html <!-- 主页面属于域A(http://domain-a.com) --> <iframe id="targetIframe" src="http://domain-b.com/token-receiver.html" style="display: none;"></iframe> <script> const iframe = document.getElementById('targetIframe'); iframe.onload = function() { // 发送 token 到目标域B的 iframe const token = "your_token_value"; iframe.contentWindow.postMessage( { action: 'SET_TOKEN', token: token }, 'http://domain-b.com' // 指定目标域,确保安全 ); }; </script> ``` #### 2. 目标页面(域B)的代码 ```html <!-- 目标页面属于域B(http://domain-b.com/token-receiver.html) --> <script> // 监听来自父窗口的消息 window.addEventListener('message', (event) => { // 验证消息来源是否合法(必须检查来源域!) if (event.origin !== 'http://domain-a.com') return; const { action, token } = event.data; if (action === 'SET_TOKEN' && token) { // 将 token 写入当前域(域B)的 localStorage localStorage.setItem('authToken', token); // 可选:发送确认回执 event.source.postMessage('TOKEN_SAVED', event.origin); } }); </script> ``` --- ### **关键注意事项** 1. **安全性验证**: - **发送方**:`postMessage` 的第二个参数必须指定目标域(`http://domain-b.com`),避免发送到恶意网站。 - **接收方**:必须检查 `event.origin` 是否合法(如 `http://domain-a.com`),防止非法域发送恶意数据。 2. **跨域限制**: - `iframe` 的 `src` 必须属于另一个域(如域B),且目标页面需要允许被嵌入(未设置 `X-Frame-Options` 头)。 3. **异步通信**: - 确保 `iframe` 加载完成后再调用 `postMessage`(通过 `iframe.onload` 事件)。 4. **浏览器兼容性**: - `postMessage` `localStorage` 在现代浏览器中广泛支持,但需考虑旧版本浏览器的降级方案。 --- ### **替代方案** - **服务端代理写入**:通过域A的服务端请求域B的接口,由域B的服务端生成 Token 并写入 Cookie/LocalStorage(需跨域头支持)。 - **第三方 Cookie**:浏览器逐渐限制第三方 Cookie,不推荐此方案。 --- ### **总结** 通过 `iframe + postMessage()` 实现跨域写入 `localStorage` 的核心是安全的跨域通信,需严格验证来源域并确保数据合法性。此方法适用于需要在前端直接操作不同域存储的场景,但需注意浏览器安全策略的更新(如 Chrome 的隐私沙盒计划可能影响跨域访问)。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值