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

16
我惊讶地发现,我的想法关于会话cookie在移动设备上的行为方式被现实否决了。
在普通的桌面浏览器上,会话cookie的行为是只要浏览器会话处于活动状态,cookie就会被保存。如果关闭最后一个浏览器窗口或进程,会话应该被关闭。
现在,在移动设备上,你几乎不会关闭浏览器应用程序,你只是将其发送到后台。
我发现在我的安卓4.0索尼Xperia Ray上,即使我清除了浏览器进程,会话cookie也不会过期。但在三星平板设备上会过期。我不知道iOS设备会如何表现。
这是一个问题!我该怎么办才能解决它?
目前,我决定让cookie在一天后过期。但我对此并不满意。我应该降低cookie的生命周期吗?也许缩短到8小时?

1
你的目标是什么?用户离开页面时结束吗?在特定时间内不发出请求?还是将他们的浏览器发送到后台?你使用什么后端? - Brigand
我想到了一种更通用的方法。我应该考虑什么等等。特别是我的目标是,如果有人允许使用JavaScript进行地理定位,但由于隐私问题(在德国),不能永久使用,我要记住这个决定。后端通常是LAMP上的Drupal或Typo3。 - yunzen
1
用户可以选择一个持续时间,比如“允许1小时”,“允许1天”,“永久允许”等。 - Dave
从设计角度来看,移动设备主要是为单人使用而设计的,因此我认为这不会成为一个问题,因为许多移动应用程序保持其会话以使用户“保持最新状态”,甚至在后台工作以拉取新数据并跟踪您对这些数据所做的操作。即使是应该保护用户隐私的邮件应用程序也会保持其会话,并且在有人借用您的移动设备时可以轻松查看。这只是个人观点。 - am05mhz
这不是行为问题,而是法律问题(特别是在德国)。 - yunzen
5个回答

5

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

但是,如果用户将浏览器放在后台,则仍然存在问题。如果他们恢复浏览并只使用站点中的链接,则仍将使用cookie。


5

使用HTML5并使用sessionStorage,这对您是否有意义?

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

基本上所有移动设备都支持sessionStorage(请参见此处),而且您可以使用像jQuery-Session-Plugin这样的框架/插件(请参考此链接)来处理会话数据(并为旧浏览器提供回退到会话cookie的功能,这些旧浏览器不支持sessionStorage)。

编辑:为了展示sessionStorage与localStorage的行为,我创建了一个演示性fiddle,在其中使用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 的链接


1
我认为它不会起作用。 我希望在一个页面上做出的决策可以在另一个页面上阅读。 - yunzen
1
sessionStorage 是针对该域名全局的,如果在页面 x 中设置了 sessionStorage 中的一个项,它将在页面 y 中可访问。 - Rob M.
@marty 移动设备上的sessionStorage与普通会话Cookie会有不同的表现吗? 我是说,智能手机上的“只要浏览器打开”是什么意思? 在平板电脑上又是什么意思呢? - yunzen
@marty 在我的 Xperia Ray 手机上,它的行为方式也是相同的。如果我将浏览器应用程序放到后台,sessionStorage 就会被删除。 - yunzen
1
这是个好消息,因为似乎sessionStorage并不像session cookies那样不可预测。现代浏览器API(包括移动浏览器)更可能专注于html5建议。很有可能sessionStorage已经被设计来解决现代设备上session cookies的缺陷。 - marty
显示剩余5条评论

4
这个问题不仅限于移动设备。如果用户经常选择“恢复上次会话”,即使在桌面浏览器上,会话cookie也可能“永久”存在(我吃了亏才知道这一点)。
下面是一个限制会话时间为一天的客户端解决方案:
设置两个cookie:
- (浏览器)会话cookie - 一个cookie在用户的夜间到期(例如,凌晨4点或5点),在设置后2到26小时之间过期(通常应在x和x + 24小时之间过期)
如果任何一个cookie缺失,则开始一个新的会话并重置它们两个。
要设置第二个cookie,您可以利用Date.getTimezoneOffset()。或者,如果您能够可靠地对用户进行地理定位,以至少粗略估计其经度,则可以使用经度来计算预期的“用户夜间中心”时间(1小时为15度经度)。两种可能性是:通过IP地址(仅知道国家可能不足够,在像美国这样的国家中,您需要至少州级别),或者通过使用CDN提供的信息,如果您使用CDN的话。
请记住,如果某些内容必须在一段时间后过期(例如服务器上的会话),则不能依赖Cookie,您还必须在服务器端检查过期时间。

2

我会询问用户是否想要记住位置。如果不想,将cookie的过期时间设置为服务器超时时间。您可以让用户选择自己的体验。

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


1

这是一个有点“不靠谱”的建议,但我认为它值得一提。我从来没有用过保持连接的手机(它们都会切断以节省电池等)- 移动网络非常快地重复使用IP地址。

也许值得在会话数据中存储IP地址,并结合“上次访问”时间戳,如果IP地址发生更改,则销毁/重启会话?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接