You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Safari 17.0中window.open与window.print导致会话数据丢失问题求助

解决Safari 17.0中window.print()触发的会话Cookie丢失问题

问题背景

运营基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:33:34