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

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

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

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

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

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

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

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

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

基本上所有移动设备都支持sessionStorage(请参阅此处 ),您可以拥有一个框架/插件,如jQuery-Session-Plugin(按照此链接 )为您处理会话数据(并为旧浏览器提供回退到会话cookie)支持sessionStorage)。

编辑 :为了显示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链接

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

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

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

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

设置两个cookie:

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

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

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

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

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

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

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

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

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