IE中用window.open() 新开页面,有时会丢失Session 的问题。

博客主要讲述IE中用window.open()新开页面时,会出现丢失Session和Authentication(用户验证信息)的问题,原因是“Browse In New Process”,某些情况下打开新进程信息未同步。还介绍了在Win2003中的设置演示及测试情况,解决方法是及时打补丁。

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

IE中用window.open() 新开页面,有时会丢失Session 的问题。

有关这个问题的详细描述,请参看:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;196383

我摘要如下:

其实不仅仅是丢失Session的问题,Authentication (用户验证信息)也会丢失。
这个问题出现的原因是因为 :
"Browse In New Process."   某些情况下,你打开IE的一个新进程,这些信息没有被同步过去。
解决方法当然是老套的及时打补丁。

上述文中,通过设置"Browse In New Process." 演示了这个问题。
在Win2003中,这个设置不在IE的 Internet 选项 -- 高级中(Win2003 IE6 中找不到这个设置),
而在资源管理器的 -- 文件夹选项 -- 查看 -- 在单独的进程中打开文件夹窗口。
如下图的设置:

演示IE丢失Session用图一 

设置好后,你在资源管理器中输入演示的ASP文件,(注意是资源管理器,不是IE)。点击 WindowOpen 按钮,你就有一定的概率,看到新开的页面跟原来的页面不是同一个Session。

以上演示是在升级了微软所有已知补丁后的Win2003上作的测试,如果是没打过补丁的版本,可能概率更高,我没有测试过。

演示用到的ASP文件,上面提到的URL中给出了,就不再重复。


 

<think>嗯,用户想了解如何使用window.open和postMessage进行跨项目页面通信。首先,我需要确认这两个项目是否在不同域或不同窗口,因为postMessage常用于跨域通信。 用户可能是在做前端发,遇到需要跨窗口或跨域传递数据的需求。比如,一个项目打另一个项目的页面,并需要发送消息,比如表单数据、状态更等。需要确保他们了解postMessage的安全机制,比如目标源和事件监听。 接下来,我应该分步骤解释:首先用window.open窗口,获取其引用;然后用postMessage发送消息,注意指定目标origin;接着在页面中用message事件监听消息,验证来源后再处理数据。同时,要提到安全性,避免使用通配符origin,防止恶意攻击。 可能用户对如何维护窗口引用不太清楚,比如在单页应用中,窗口可能被浏览器拦截,需要处理弹窗拦截的情况。或者,在发送消息时,是否需要等待页面加载完成,否则postMessage可能失败。这些细节需要提到。 另外,示例代码会有帮助,展示基本用法。同时提醒错误处理和兼容性,虽然现代浏览器都支持postMessage,但旧版本可能需要polyfill?不过通常不需要,因为兼容性很好。 用户可能还想知道除了字符串,能否发送其他数据类型,比如对象,这时可以用JSON序列化。或者是否需要双向通信,比如子页面向父页面发送消息,同样使用postMessage并指定父窗口的origin。 总结步骤:打窗口、发送消息、监听消息、验证来源、处理数据、关闭通信。确保用户理解每个环节的重要性和潜在问题。好的</think>!使用 `window.open` 结合 `postMessage` 实现跨窗口/跨域通信,是前端中一种常见的跨页面通信方案。以下是详细的介绍和示例: --- ### **1. 核心概念** - **`window.open(url, name)`**: 用于打一个窗口或标签页,返回窗口的引用。 - **`postMessage(data, targetOrigin)`**: 允许不同源的窗口之间安全地发送消息。 - `data`: 要传递的数据(字符串或对象)。 - `targetOrigin`: 目标窗口的源(如 `https://example.com`),设为 `*` 表示不限制(不安全)。 --- ### **2. 实现步骤** #### **(1) 父窗口(发送消息方)** ```javascript // 打子窗口,保存其引用 const childWindow = window.open('https://other-project.com/page'); // 等待子窗口加载完成后发送消息 childWindow.onload = () => { // 发送消息到子窗口,指定目标 origin childWindow.postMessage( { type: 'GREETING', data: 'Hello from parent!' }, 'https://other-project.com' ); }; ``` #### **(2) 子窗口(接收消息方)** ```javascript // 监听 message 事件 window.addEventListener('message', (event) => { // 验证消息来源的 origin if (event.origin !== 'https://parent-project.com') return; // 处理接收到的消息 if (event.data.type === 'GREETING') { console.log('Received:', event.data.data); // Output: "Hello from parent!" // 可选:回复消息 event.source.postMessage( { type: 'REPLY', data: 'Hi back!' }, event.origin ); } }); ``` --- ### **3. 关键注意事项** 1. **安全性**: - 始终在接收方验证 `event.origin`,避免恶意网站拦截消息。 - 避免使用 `targetOrigin: '*'`,明确指定目标域名。 2. **跨域限制**: - `postMessage` 是唯一安全的跨域通信方式,绕过 CORS 限制。 3. **窗口引用管理**: - 如果子窗口关闭后再调用 `postMessage` 会报错,需做好错误处理。 - 可通过 `window.opener` 在子窗口获取父窗口的引用(需同源)。 4. **数据类型**: - 可以传递对象、数组等结构化数据(无需手动 `JSON.stringify`)。 --- ### **4. 完整双向通信示例** #### **父窗口代码** ```javascript const childWindow = window.open('child.html'); // 发送消息 childWindow.postMessage({ cmd: 'init', value: 42 }, 'https://child-domain.com'); // 接收回复 window.addEventListener('message', (event) => { if (event.origin !== 'https://child-domain.com') return; console.log('Parent received:', event.data); }); ``` #### **子窗口代码** ```javascript // 接收消息并回复 window.addEventListener('message', (event) => { if (event.origin !== 'https://parent-domain.com') return; console.log('Child received:', event.data); event.source.postMessage({ ack: true }, event.origin); }); ``` --- ### **5. 常见问题** - **弹窗拦截**: 浏览器可能拦截 `window.open`,确保在用户交互(如点击事件)中触发。 - **窗口生命周期**: 子窗口关闭后,父窗口需清除相关引用。 - **兼容性**: 所有现代浏览器均支持 `postMessage`,IE8+ 部分支持。 通过这种方式,可以实现跨项目、跨域的页面间安全通信,适用于单点登录(SSO)、跨应用数据同步等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值