Windows Phone 8.1 上的 Internet Explorer 丢失会话和永久 cookie

Internet Explorer on Windows Phone 8.1 losing session and permanent cookies

我们有一个 SaaS 应用程序,其中浏览器使用名为 session-id 的 cookie 连接到服务器端会话。此 cookie 的值是第一次看到任何给定浏览器时创建的 UUID v4 标识符。我们将 cookie 发送为

Set-Cookie: session-id=ebbaf531-8763-4a59-b086-d946124f8d64; Path=/; HttpOnly; Secure;

除了 Windows 上的 Internet Explorer 运行 Phone 8.1 似乎有 cookie 突然丢失的问题,其他一切似乎都很好。

导致cookie丢失的案例:

  1. 在 phone 上切换或启动任何其他需要大量 RAM 的应用程序。
  2. 正在关闭浏览器(按住后退按钮 2 秒,点击浏览器屏幕截图上的 (X))。
  3. 正在重启 phone

案例 1 尤其有问题,因为它对用户来说看起来像是随机故障。在这种情况下,Internet Explorer 将重新加载页面,并且页面重新加载的 GET 请求缺少 cookie。我知道案例 2 和案例 3 是预期的行为,因为我在上面使用了会话 cookie。

我还尝试使用

设置永久(28 天)cookie
Set-Cookie:session-id=ebbaf531-8763-4a59-b086-d946124f8d64; Path=/; HttpOnly; Secure; max-age=2419200; Domain=peda.net

同样的行为仍然存在。请注意,此 "permanent" cookie 不会持续浏览器重启或 phone 重启。

是否有已知的解决方法可以避免随机丢失 cookie?我正在尝试让用户选择加入永久会话,并且所有其他浏览器都正常工作. Windows Phone 8.1 上的 Internet Explorer 是最后剩下的障碍。我已经尝试添加和删除属性 domain 但没有任何效果。

根据我的测试,session cookies 什么也做不了。 Windows Phone 上的 Internet Explorer 将始终丢弃列出的所有情况下的所有 session cookie。对于情况 (1),当 Internet Explorer 在后台 运行 时,cookie 丢弃的原因是内存不足,这尤其成问题。

但是,可以解决永久性 cookie 问题。事实证明 Windows Phone 8.1 上的 Internet Explorer 运行(可能所有其他版本也一样)仅支持 non-standard expires 参数而不是 max-age 范围。同样的情况也发生在 Internet Explorer 6.0 - 8.0 的桌面版本上,所以我猜想 Windows Phone 版本是围绕 MSIE 8.0 分叉出来的,并且包含与 cookie 大致相同的问题。不需要参数 domain

因此正确的 Set-Cookie header 如下所示:

Set-Cookie: session-id=ebbaf531-8763-4a59-b086-d946124f8d64; Path=/; HttpOnly; Secure; max-age=2419200; expires=Thu, 14 Apr 2016 13:12:28 GMT

注意expires参数的格式。这种确切的格式具有最大的兼容性。当然,您需要动态计算此属性的正确值以匹配 max-age 属性。