Safari 17.0中window.open与window.print导致会话数据丢失问题求助
问题背景
运营基于PHP/HTML/JavaScript的文档打印站点,在Mac Sonoma系统的Safari 17.0版本更新后出现异常:通过window.open打开新标签页的打印页面,点击页面中调用window.print()的按钮打开打印窗口后,会话Cookie会丢失,触发后台自动登出、打印窗口空白等问题。
重现步骤
- 创建
./index.php页面,设置会话Cookie,添加按钮并绑定点击事件:onclick="window.open('./anyfolder/printpage.php', '_blank');" - 在
printpage.php中添加打印按钮,绑定点击事件:onclick="window.print();" - 点击
index.php的按钮,新标签页打开printpage.php,此时Cookie正常存在 - 点击
printpage.php的打印按钮,打开Safari打印窗口,等待几秒后Cookie丢失,触发登出
关键观察
- 仅在Safari 17.0及后续未修复版本中出现,通过CMD+P或Safari菜单打开打印对话框无异常,仅
window.print()会触发问题 - 打开打印对话框时,打开打印页的原标签页会变为空白(地址栏为空),点击返回可恢复原页面及会话
- 关闭原标签页后点击打印可正常使用;将打印页标签拖入新窗口、或通过表单打开打印页面,不会触发Cookie丢失
- 极简示例场景未复现问题,但实际登录后的站点场景会出现:打印对话框弹出后自动登出、打印窗口空白、部分
window.open按钮突然失效需重启Safari
可行解决方案
由于这是Safari的明确bug,目前官方尚未修复,可通过以下方式规避:
1. 替换打印触发方式
引导用户使用Safari原生打印功能:在打印页面添加提示,告知用户使用CMD+P快捷键或点击Safari菜单的「文件-打印」选项,替代页面中的window.print()按钮。
2. 修改打印页打开逻辑
- 使用表单提交(POST/GET)替代
window.open打开打印页,避免新标签页与原窗口的会话关联触发bug - 打开打印页时添加
noopener参数,切断新标签页与原窗口的关联:
此方式可避免原窗口被打印操作影响而出现空白、会话丢失的问题。window.open('./anyfolder/printpage.php', '_blank', 'noopener')
3. 打印页会话加固
在printpage.php加载完成后,通过AJAX请求后端接口重新验证会话,并刷新会话Cookie,确保打印过程中会话状态保持:
// printpage.php 中的脚本 window.addEventListener('load', function() { fetch('/api/refresh-session', { credentials: 'include' }) .then(res => res.json()) .catch(err => console.error(err)); });
4. 临时操作提示
在打印按钮旁添加提示,告知用户若遇到会话丢失问题,可先关闭原标签页,再点击打印按钮,此方式可绕过bug触发条件。
内容的提问来源于stack exchange,提问作者Bobbub
相关产品推荐
相关产品推荐

