【问题标题】:Call a function/handler when session get destroyed会话被销毁时调用函数/处理程序
【发布时间】:2018-01-10 09:54:54
【问题描述】:

我用 PHP 编写了一个带有用户身份验证的网站。我为此使用了会话。当用户登录时,会在数据库中设置一个标志,当他注销时,该标志会被重置。这可以防止一个用户多次登录网站。

一切正常,但是当用户忘记注销时,会话会在一段时间后失效。当用户现在尝试重新登录时,他将被阻止登录,因为该标志仍然设置。

我需要一个处理程序/函数,当会话变得无效/被破坏时将被调用。我该怎么做?

我知道有一个名为 session_set_save_handler 的函数,但我只需要 destroy 函数。不需要其他函数,我可以访问该函数中的 $_SESSION 变量吗?因为在这个变量中保存了用户ID,需要重置其标志。

感谢您的帮助。

【问题讨论】:

  • 不要这样做。支持每个用户多个同时会话。人们切换设备、浏览器、计算机、网络等。你真的想阻止某人这样做吗?没有其他人这样做,并且用户希望事情能够正常工作。
  • PHP 没有真正的方法可以做到这一点。您必须在数据库中设置一个时间戳并设置一个 cron 以在 X 分钟后删除该标志,这应该与您设置的默认会话超时相对应。话虽如此,这是一个坏主意。用户可能希望拥有多个会话。
  • 嗨,布拉德,感谢您的回复。我在一个商业网站上工作,人们可以在那里购买一个帐户。这种方法可以防止他们只购买一个帐户并分发该帐户。
  • 您应该使用更好的启发式方法来解决该问题。例如,允许在一个小的地理区域内同时登录 X 次。如果用户似乎同时在两台设备上使用同一个帐户,则引发手动检查标记。不要将每个人硬限制在一个设备上;您需要在用户友好性和收入保护之间取得平衡,单个数据库标志不是解决方案。
  • “我需要一个处理程序/函数,当会话无效/被销毁时将被调用” - 问题是,会话没有主动这样做 - 变成无效,或销毁。会话 cookie 有一定的生命周期,它会过期。但这不会删除存储在服务器上的会话数据——这是垃圾收集器的工作。

标签: php session session-set-save-handler


【解决方案1】:

由于 PHP 没有进程可以在后台检查您的会话,因此您必须使用 cron 作业来检查您的陈旧会话,或者在任何人访问重置所有陈旧会话的站点时调用一个函数。两者都不理想。

与其担心 cron 作业,为什么不在登录时检查会话?使用可以检查陈旧性的 DATETIME 字段代替简单的标志。每当用户在系统上执行任何操作时,都可以调用类似于“last_accessed”的字段并将其更新为 NOW()。然后,当他们从另一个浏览器登录时,如果“last_accessed”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多