【问题标题】:Simulate session cookies in mobile sessions?在移动会话中模拟会话 cookie?
【发布时间】:2013-02-18 14:21:05
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 你的目标是什么?离开页面时结束它?不要在一定时间内提出请求?或者将他们的浏览器发送到后台?你用的是什么后端?
  • 我想到了一种更通用的方法。我应该考虑什么等等。特别是我的目标是,我记得这个决定,如果有人允许使用 javascript 进行地理定位,但由于隐私问题(在德国),永远不会。后端通常在 LAMP 上使用 drupal 或typo3。
  • 让用户选择一个持续时间怎么样,比如“允许 1 小时”、“允许 1 天”、“永远允许”等。
  • 好吧,从设计的角度来看,移动设备主要是为单人使用而设计的,所以我认为这不是问题,因为许多移动应用程序会保持会话以保持用户“最新” ,甚至可以在后台提取新数据并跟踪您对这些数据所做的操作。即使是应该保护用户隐私的邮件应用程序也会保留他们的会话,并且可以在有人借用您的移动设备时轻松查看。只是一个意见。
  • 这不是行为问题,而是法律问题(尤其是在德国)

标签: javascript jquery mobile cookies weinre


【解决方案1】:

您采用 HTML5 方式并使用 sessionStorage 是否有意义?

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

基本上所有的移动设备都支持 sessionStorage(参见 here),您可以使用像 jQuery-Session-Plugin(关注 this link)这样的框架/插件为您处理会话数据(并提供 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

【讨论】:

  • 我认为它不会起作用。我想在一个页面上做出决定,以便在不同的页面上阅读。
  • sessionStorage 对域来说是全局的,如果你在第 x 页的 sessionStorage 中设置了一个项目,它将可以在第 y 页访问
  • @marty - sessionStorage 不是每个页面,而是每个域
  • 引用developer.mozilla.org/en-US/docs/DOM/Storage : > "全局对象 (sessionStorage),维护一个在页面会话期间可用的存储区域。只要浏览器打开并存活,页面会话就会持续页面重新加载和恢复。在新选项卡或窗口中打开页面将导致启动新会话。"
  • ... 这是个好消息,因为 sessionStorage 似乎不像会话 cookie 那样不可预测。现代浏览器 API(包括移动浏览器)更有可能专注于 html5 推荐。 sessionStorage 很有可能被设计用来解决现代设备中会话 cookie 的缺点。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    设置两个cookie:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-06-25
          • 2012-02-09
          • 2012-09-06
          • 1970-01-01
          • 2011-07-07
          • 2011-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多