在移动会话中模拟会话cookie?

时间:2013-03-04 13:19:50

标签: javascript jquery mobile cookies weinre

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

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

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

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

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

目前,我决定让Cookie在一天后到期。但我对此并不满意。
我应该降低寿命吗?也许到8个小时?

5 个答案:

答案 0 :(得分:5)

您是否有理由使用HTML5方式并使用 sessionStorage

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

基本上所有移动设备都支持sessionStorage(参见here),您可以拥有一个框架/插件,如jQuery-Session-Plugin(跟this link)为您处理会话数据(并提供< em> fallback 到不支持sessionStorage的旧浏览器的会话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});

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

以下是link to jsfiddle

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

此问题不仅限于移动设备。如果用户经常选择“恢复之前的会话”(我从困难的方式学到了这一点),会话cookie也可以在桌面浏览器上“永久”持续。

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

设置两个cookie:

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

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

要设置第二个Cookie,您可以使用Date.getTimezoneOffset()。或者,如果您能够可靠地对用户进行地理定位,使您至少对其经度进行粗略估计,则可以使用经度来计算“用户中间的夜晚”预计的时间(1小时为15度)经度)。两种可能性是:通过IP地址(知道国家可能不够,但在美国这样的国家,至少需要州级),或者使用CDN提供的信息,如果你使用的话。

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

这是一个建议,绝不是傻瓜证明 - 但我认为值得一提。我从来没有一个电话在闲置时保持连接到互联网(它们全部切断以节省电池等等) - 移动网络非常快速地回收IP地址。

可能值得在会话数据中存储IP地址,并且 - 可能与上次访问的时间戳一起 - 如果IP地址发生变化,则会破坏/重新启动会话?

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