前端通过 iframe+postMessage() 方式,将同一份 Token 写入到了多个域下的 LocalStorage 中
时间: 2024-10-24 12:15:51 浏览: 13
Springsecurity安全框架案例+多页面登录+redis+token
前端使用iframe结合`postMessage()`方法,在跨域场景下让同一个Token能够在多个不同的域名下的localStorage中存储,实际上是利用了浏览器的同源策略的一个变通做法。具体步骤如下:
1. **创建 iframe**:在一个页面上嵌套一个 iframe,这个 iframe 的 `src` 指向另一个安全来源(可以是同一源,或者通过 CORS 允许跨域)。
2. **消息传递**:当有 Token 需要在其他子域设置 localStorage 时,主页面(通常称为“顶层窗口”)会发送一个包含 Token 的 `postMessage` 请求到 iframe。
```javascript
// 主页面
const token = 'your_token';
parent.postMessage({ action: 'setToken', token }, 'https://other-domain.com');
```
3. **接收并处理消息**:在 iframe 中,需要监听 `message` 事件来接收主页面传递的数据,并在接收到后操作 localStorage:
```javascript
// 如果rame
window.addEventListener('message', (event) => {
if (event.origin === 'https://top-level-domain.com') {
const { action, token } = event.data;
if (action === 'setToken') {
window.localStorage.setItem('token', token);
}
}
});
```
这种方式虽然实现了数据在不同域下的共享,但需要注意安全性问题,因为主页面能控制 iframe,有可能被恶意利用。此外,如果子域的同源策略不允许来自其他域的消息,这种方法就无效了。
阅读全文