【问题标题】:maintaining state without a cookie在没有 cookie 的情况下保持状态
【发布时间】:2010-11-16 06:21:39
【问题描述】:

我正在尝试了解 IPB 论坛的运作方式。

如果我勾选记住我,那么即使我关闭浏览器并重新打开它,我也会保持登录状态。

我正在尝试测试这是如何实现的,因为服务器设置的唯一 cookie 在会话结束时过期,即当我关闭浏览器时。那么服务器如何不使用cookies如何恢复会话呢?

编辑:会话 id cookie 设置为在会话结束时过期,我将浏览器设置为在会话结束时删除 cookie。

这意味着当我关闭浏览器(会话结束)时,cookie 应该被删除。

在我的浏览器关闭期间,如果我在不同的浏览器中打开同一个站点,会话肯定应该恢复吗?然而,这不会发生。

相反,如果我打开原来的浏览器,会话会继续。

唯一的其他 cookie 集是一个名为 pass_hash 的 cookie,它在创建后立即过期,并在每次加载页面时由服务器发送。所以它不会被用于身份验证。

【问题讨论】:

    标签: session cookies forum


    【解决方案1】:

    cookie 的一个隐秘替代方案是图像或其他对象中的最后修改时间戳。服务器可以为您提供将时间戳设置为标识会话的值的图像。当您加载另一个页面时,浏览器会发送一个 if-modified-since timestamp 并让您离开。

    【讨论】:

      【解决方案2】:

      使用浏览器 localStorage 对象。示例:

      localStorage.setItem("lastname", "Smith");
      var name = localStorage.getItem("lastname");
      

      【讨论】:

        【解决方案3】:

        通常 cookie 在您关闭浏览器后持续存在。如果您使用的是 PHP,请查看 set_cookie's 选项,或者如果您正在使用会话,请查看 session 区域。

        // Set Cookie
        setcookie($name, $value, $expire) 
        // $expire is the time in seconds since Unix Epoch (see [time()][3]) it will stay alive
        // Session
        session_set_cookie_params($lifetime) 
        // $lifetime is the seconds it will stay alive in seconds
        

        【讨论】:

          【解决方案4】:

          当浏览器窗口关闭时,会话信息不一定会被破坏。例如,在 PHP 中,您可以选择将会话信息保存在数据库中,并且您可以在浏览器关闭和原始会话结束后保持该信息。

          我能想到的另一种方法是在 Users 表上设置一个标志,表明该用户仍处于登录状态。也许该表有一个名为 logged_in 的字段,您可以将其设置为 true。一定时间后[即,你没有回来],它将被重置为 false。

          【讨论】:

          • 如果浏览器窗口关闭,并且会话 cookie 设置为在会话结束时过期,并且当我关闭浏览器(结束会话)时 cookie 被删除,这是否意味着如果我在不同的浏览器中打开网站,会话应该恢复吗?如果没有,为什么不呢?
          • 这可能是它的工作原理。他们可以将会话与您的 IP 地址和登录时间一起存储。当您回来时,他们可以检查您的 IP,将其与用户名和上次登录的时间相匹配(注意:如果超过 1 小时,请登录必需的)。但是,您必须在用户注销时删除这些字段值。
          • 为什么会话不能在不同的浏览器中恢复?
          • 浏览器信息也可以与所有其他信息一起存储。 也许您可以联系 IPB 论坛,了解他们如何存储您的“记住我”详细信息。
          • 很遗憾,我无法寻求 IPB 的支持。我不认为浏览器信息正在被使用,因为我使用了同一浏览器的不同副本。它一定是某种存储。
          【解决方案5】:

          除了 cookie 之外,还有一些地方可以隐藏会话信息。

          URL 中的会话密钥 (http://example.com/app/234348738790/main)

          作为 GET 变量的会话密钥 (?sess=257892345)

          作为 POST 变量的会话密钥(输入类型='hidden')

          将其存储在浏览器的本地存储中

          使用 javascript 与上述任何一种将会话信息传回服务器。

          【讨论】:

          • 我在理解 IPB 如何工作时遇到的问题是,这些方法都不起作用。除非是一些自定义隐藏的javascript单独存储状态...
          【解决方案6】:

          在我看来,您只是错过了一个 cookie(或在它过期时误读/误解了),但另一种可能性可能是它将远程地址存储在数据库中并自动为其创建一个新会话访问。然而,这将是一个相当糟糕的解决方案,无论是在安全方面还是由于 NAT 等原因 - 所以我怀疑这就是 IPB 所做的。

          【讨论】:

          • 我没有错过任何 cookie...我一直在监视它们,因为它们被创建并检查它们的到期日期以尝试理解。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-16
          • 1970-01-01
          相关资源
          最近更新 更多