我第一眼就惊讶地发现,我对会话cookie在移动设备上的行为方式的看法被现实所推翻。
在普通桌面浏览器上,只要浏览器会话处于活动状态,行为就是存储会话cookie。如果最后一个浏览器窗口/进程已关闭,则应关闭该会话。
现在,在移动设备上,您几乎无法关闭浏览器应用,只需将其发送到后台即可。
我在Android 4的索尼Xperia Ray上发现,即使我清除了浏览器进程,会话cookie也没有过期。但在三星平板设备上它会。我不知道iOS设备如何以这种方式运行。
这是一个问题!?我该怎么做才能解决这个问题?
目前,我决定让Cookie在一天后到期。但我对此并不满意。
我应该降低寿命吗?也许到8个小时?
答案 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});
看看控制台。您将看到,当您启动客户端浏览器的新会话时,宽度将变化,而高度将保持不变(因为本地存储是每个域)。
答案 1 :(得分:5)
我对类似问题的解决方案是将document.referrer
与Cookie结合使用。如果用户在您的站点内导航,则继续使用cookie(如果存在),否则将过期或替换cookie。
当用户在您的网站上将浏览器置于后台时,问题仍然存在。如果他们继续浏览并只使用您网站中的链接,则仍会使用该Cookie。
答案 2 :(得分:4)
此问题不仅限于移动设备。如果用户经常选择“恢复之前的会话”(我从困难的方式学到了这一点),会话cookie也可以在桌面浏览器上“永久”持续。
将会话限制为一天的客户端解决方案如下:
设置两个cookie:
如果缺少EITHER cookie,请启动一个新会话并重置它们。
要设置第二个Cookie,您可以使用Date.getTimezoneOffset()
。或者,如果您能够可靠地对用户进行地理定位,使您至少对其经度进行粗略估计,则可以使用经度来计算“用户中间的夜晚”预计的时间(1小时为15度)经度)。两种可能性是:通过IP地址(知道国家可能不够,但在美国这样的国家,至少需要州级),或者使用CDN提供的信息,如果你使用的话。
请记住,如果某些内容必须在一段时间后过期(例如,服务器上的会话),那么您不能依赖cookie,您也必须检查服务器端的过期时间。
答案 3 :(得分:2)
我会询问用户是否想要记住该位置。如果没有将cookie的到期时间设置为服务器超时。您将为用户提供选择用户体验的选择。
您可以尝试附加到onbeforeunload事件并向服务器发帖以更改Cookie的过期时间,或者如果cookie不是安全类型,则将其从java脚本中删除。
答案 4 :(得分:1)
这是一个脏建议,绝不是傻瓜证明 - 但我认为值得一提。我从来没有一个电话在闲置时保持连接到互联网(它们全部切断以节省电池等等) - 移动网络非常快速地回收IP地址。
可能值得在会话数据中存储IP地址,并且 - 可能与上次访问的时间戳一起 - 如果IP地址发生变化,则会破坏/重新启动会话?
显然,这假设客户端是通过移动网络而不是wifi连接的。