【问题标题】:Delete session and cookies then create new one - only takes effect at next page load删除会话和 cookie,然后创建新的 - 仅在下一页加载时生效
【发布时间】:2013-06-05 05:26:57
【问题描述】:

我使用 Codeigniter(这可能是我的问题的原因),我通过几个 cookie 和会话变量来识别用户。当用户想要注册但根据他们的 cookie 检测到已经有一个帐户时(例如,其他人在他们的计算机上注册了),这是在提交注册表单后控制器中当前发生的情况:

  • 如果检测到用户 #4 已有帐户但仍注册:删除 会话和 cookie,然后创建新的用户识别会话和 cookie 作为用户 #5 并继续处理数据库内容。
  • 否则,以用户 #4 的身份继续处理数据库内容。

问题:删除会话和/或 cookie 仅在下一页加载时发生,这意味着我注册了用户 4(覆盖当前用户 4)但它变成了用户 5(谁拥有下一页加载后,数据库中没有任何内容)。正确的行为是立即删除,这样当我创建新会话 + cookie 时,它​​会为用户 #5 正确创建帐户。

如何立即删除会话变量 + cookie,而不是在下一页加载时?

更新: 经过一些测试后会发生这种情况:在下一页加载之前不会删除 cookie;会话变量会立即删除,但不会在下一页加载之前设置。因此需要修复 2 个不同的问题,以便它们都被立即删除并重新设置。

【问题讨论】:

  • 问题是即使 CI 会话也是 cookie,并且只有以下请求才可用
  • 只需在您的登录页面中无条件地擦除会话。 if (login == successful) { $_SESSION = array() }。那么之前的用户做了什么就无关紧要了。新用户将获得全新的干净会话
  • @DamienPirsy 我使用 CI 会话的数据库存储,所以在我的情况下它们不是 cookie
  • @MarcB 问题是如果用户稍后回来,我会使用 cookie 来显示一些(非敏感)数据;我使用会话来了解用户是否已登录,因此在登录后删除它们会自动将它们注销...会话在 2 小时后或注销时被删除,但当用户返回站点时只有一个cookie,我创建了一些“低信任”会话变量来识别他。
  • 您无法在没有页面加载的情况下设置或删除 cookie,因为 cookie 是通过标题设置的。

标签: php codeigniter session cookies


【解决方案1】:
detect user
delete cookies
    optionally you could create new session data right here
redirect to some page of your choosing :)

这样它就会正确地拾取它(并创建新数据)

【讨论】:

  • 在我的情况下,如果用户来了,我不知道那是否真的是他们,直到他们登录。因此,如果用户仅使用 cookie 访问该站点,我会创建一些会话变量,一个是信任为“低”。只要他们不登录,我就无法知道它实际上是用户还是其他人使用旧 cookie。因此,当他们尝试注册时,我需要能够立即删除会话和 cookie,而不是再次加载页面然后再执行(糟糕的用户体验)。
  • 不,我的朋友-您正在描述“记住我”功能-它应该作为:用户将cookie留在他身后,用户回来,系统检测到该cookie并签入例如数据库,如果存在正确的记录并且有效(浏览器、系统、IP) - 如果一切正常,您登录用户并继续 - 如果有任何问题,您会销毁该数据(cookie)并重定向到登录页面
  • 如果您说用户必须登录,以便您可以将信任从“低”更改为其他内容(可能已登录的用户),那么您首先不需要该 cookie
  • 这就是它的工作原理,直到“如果一切正常,您登录用户”:在我的情况下,“记住我”是非敏感内容的软功能,但它们实际上需要正确登录以获得完全信任,因为他们的帐户包含敏感数据,例如他们的银行详细信息。因此,我认识到这是同一台计算机等并进行了“软登录”,但是当他们来注册并实际填写表格时,我知道他们肯定是新用户,然后删除了所有内容。强迫他们在与网站交互之前登录会完全扼杀转化。
  • 我需要 cookie 来记住一些数据,以便根据他们之前的搜索向他们显示相当于价格建议的内容,如果他们在收到时事通讯或几天后。
【解决方案2】:

最后我改变了我的脚本,直接创建了一个新用户,而不是依赖 cookie 或 session 来识别用户,这意味着我不必担心 cookie 或 session 变量何时被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多