16

乍一看,我惊讶地发现,我对会话 cookie 在移动设备上的行为方式的想法被现实所推翻。

在普通桌面浏览器上,只要浏览器会话处于活动状态,行为就是存储会话 cookie。如果最后一个浏览器窗口/进程已关闭,则应关闭会话。

现在在移动设备上,您几乎不会关闭浏览器应用程序,只需将其发送到后台即可。

我在装有 Android 4 的 Sony Xperia Ray 上发现会话 cookie 没有过期,即使我清除了浏览器进程。但在三星平板设备上它会。我不知道,iOS 设备的行为方式如何。

这是个问题!?我应该怎么做才能解决它?

现在,我决定让 cookie 在一天内过期。但我对此不太满意。
我应该降低寿命吗?也许到 8 小时?

4

5 回答 5

5

我对类似问题的解决方案是document.referrer将 cookie 与 cookie 结合使用。如果用户在您的站点内浏览,则继续使用 cookie(如果存在),否则过期或替换 cookie。

但是,当用户在您的网站上将浏览器置于后台时,问题仍然存在。如果他们继续浏览并仅使用您网站中的链接,则仍将使用 cookie。

于 2013-03-15T17:53:58.900 回答
5

采用 HTML5 方式并使用sessionStorage对您来说有意义吗?

这样您就可以独立于不同设备处理浏览器会话的方式,因为 HTML5 会话存储是按窗口进行的,因此它仅限于浏览器窗口的生命周期。

基本上所有的移动设备都支持 sessionStorage(见这里),你可以有一个框架/插件,比如 jQuery-Session-Plugin(点击这个链接)为你处理会话数据(并为不支持的旧浏览器提供回退到会话 cookie支持会话存储)。

编辑:为了显示 sessionStorage 与 localStorage 的行为,我创建了一个小提琴(用于演示目的)使用 sessionStorage 存储 div 的宽度和 localStorage 存储同一 div 的高度:

var randomWidth,
    randomHeight;
if (!(randomWidth= $.session.get("randomWidth"))) {    // assignment
    randomWidth = Math.random() * 300;
    $.session.set("randomWidth", randomWidth, true);
    console.log("just assigned and stored in sessionStorage: randomWidth: " + randomWidth);
} else {
    console.log("from sessionStorage: randomWidth: " + randomWidth);
}
if (!(randomHeight= $.domain.get("randomHeight"))) {    // assignment
    randomHeight = Math.random() * 300;
    $.domain.set("randomHeight", randomHeight, true);
    console.log("just assigned and stored in localStorage: randomHeight: " + randomHeight);
} else {
    console.log("from localStorage: randomHeight: " + randomHeight);
}
$(".test").css({width: randomWidth, height: randomHeight});

看看控制台。您会看到,当您启动客户端浏览器的新会话时,宽度会发生变化,而高度将保持不变(因为本地存储是每个域的)。

这是jsfiddle的链接

于 2013-03-13T16:45:53.573 回答
4

此问题不仅限于移动设备。如果用户不断选择“恢复上一个会话”,会话 cookie 也可能在桌面浏览器上“永远”持续(我很难学到这一点)。

将会话限制为一天的客户端解决方案如下:

设置两个cookie:

  • (浏览器)会话 cookie,以及
  • cookie 在用户半夜(例如凌晨 4 点或凌晨 5 点)过期,在设置后的 2 小时到 26 小时之间(通常,它应该在窗口 btw.x 和x+24 小时)

如果缺少任何一个 cookie,请启动一个新会话并重置它们。

要设置第二个 cookie,您可以使用Date.getTimezoneOffset(). 或者,如果您能够可靠地定位用户,以便您至少可以粗略估计他们的经度,您可以使用经度来计算“用户的午夜”预计的时间(1 小时是 15 度经度)。两种可能性是:通过 IP 地址(尽管知道国家/地区可能还不够:在像美国这样的国家,您至少需要州级别),或者通过使用 CDN 提供的信息(如果您使用一个)。

请记住,如果某些东西必须在一段时间后过期(例如,服务器上的会话),那么您不能依赖 cookie,您也必须在服务器端检查过期。

于 2013-03-18T20:49:19.577 回答
2

我会询问用户是否想记住该位置。如果未将 cookie 的过期时间设置为服务器的超时时间。您将为用户提供选择用户体验的选择。

您可以尝试附加到 onbeforeunload 事件并发布到服务器以更改 cookie 的到期时间,或者如果 cookie 不是安全类型,则将其从 java 脚本中删除。

于 2013-03-14T21:04:25.943 回答
1

这是一个有点肮脏的建议,绝不是万无一失的——但我认为值得一提。我从来没有一部手机在空闲时保持连接到互联网(它们都切断以节省电池和诸如此类的东西) - 并且移动网络非常迅速地回收IP地址。

可能值得将 IP 地址存储在会话数据中,并且可能与上次访问的时间戳一起 - 如果 IP 地址更改,则销毁/重新启动会话?

显然,这假设客户端是通过移动网络而不是 wifi 连接的。

于 2013-03-18T21:22:39.753 回答