一个页面是地址是http://192.168.1.202/,一个页面地址是http://192.168.1.183/,如何在a页面使用window.open打开页面b后,让页面b能够获取到页面a代码里面保存的本地缓存。相当于两个不同页面共用同一个缓存。
一个页面是地址是http://192.168.1.202/,一个页面地址是http://192.168.1.183/,如何在a页面使用window.open打开页面b后,让页面b能够获取到页面a代码里面保存的本地缓存。相当于两个不同页面共用同一个缓存。
### 回答
在标准的浏览器环境中,由于同源策略(Same-Origin Policy)的限制,不同源的页面(即协议、域名或端口不同的页面)无法直接共享本地缓存(如 `localStorage`、`sessionStorage` 等)。这些存储机制是特意设计为隔离的,以防止跨站脚本攻击(XSS)。
#### 解决方案
1. **使用服务器端的存储**:
- 你可以将需要共享的数据存储在服务器端(如数据库、Redis 等),然后通过 API 请求来访问这些数据。
2. **使用第三方存储服务**:
- 使用如 Firebase、IndexedDB(虽然也受限于同源策略,但可以在单个域下管理多个应用的数据)、或者其它第三方存储解决方案来存储和共享数据。
3. **使用 URL 参数或 PostMessage**:
- 如果数据量不大,你可以考虑通过 URL 参数传递数据(虽然这种方法不适合大量数据)。
- 使用 `window.postMessage` 方法可以在不同源的窗口之间安全地传递消息。页面 A 可以将缓存数据通过 `postMessage` 发送给页面 B,前提是页面 B 需要监听来自页面 A 的消息。
// 页面 A 的代码
var otherWindow = window.open("http://192.168.1.183/", "_blank");
otherWindow.postMessage({ key: "value" }, "http://192.168.1.183");
// 页面 B 的代码
window.addEventListener("message", function(event) {
if (event.origin !== "http://192.168.1.202") {
// 不接受来自非信任源的消息
return;
}
console.log(event.data); // 处理接收到的数据
}, false);
4. **修改同源策略(不推荐)**:
- 在开发环境中,你可以通过修改浏览器的安全设置或启动参数来放宽同源策略的限制,但这通常不推荐用于生产环境,因为它会极大地增加安全风险。
综上所述,最安全和最常见的方法是使用服务器端存储或 `window.postMessage` 来在不同源的页面之间共享数据。
window.open(b);
在b页面你可以使用window.opener拿到a页面的window对象,然后你就可以随便读取window对象上的属性和方法了
使用中间网页作为桥接进行共享,这有一个开源库示例: https://github.com/zendesk/cross-storage/tree/master/example
由于页面A和页面B在同一个局域网但不同IP地址上,直接共享localStorage或sessionStorage是不可能的,因为这些存储机制遵循同源策略(即相同域名、协议和端口)。
可以使用postMessage方法在不同源之间进行通信。以下是一个示例,展示如何通过iframe和postMessage实现跨域数据共享:
1.在页面A中嵌入页面B的iframe并发送消息:
<!-- 页面A的HTML -->
<iframe id="iframeB" src="http://192.168.1.183/" style="display:none;"></iframe>
<script>
const iframe = document.getElementById('iframeB');
iframe.onload = () => {
const data = { key: 'sharedData', value: '这是共享的数据' };
iframe.contentWindow.postMessage(data, 'http://192.168.1.183');
};
</script>
2.在页面B中接收消息并存储数据:
<!-- 页面B的HTML -->
<script>
window.addEventListener('message', (event) => {
if (event.origin === 'http://192.168.1.202') {
const { key, value } = event.data;
localStorage.setItem(key, value);
console.log('接收到的数据:', key, value);
}
});
</script>
利用了postMessage来跨域传递数据,从而实现不同IP地址页面之间的数据共享。
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
6 回答2.3k 阅读
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
如果是从A页面中打开B页面,或者从B页面打开A页面,那么可以通过 window.postMessage 这个API进行跨源通讯。
如果不能保证这一层关系的话就不能了,老老实实通过后端通讯。