我想将登录、注销和持续时间存储在数据库中。
- 用户通过身份验证(成功登录)时创建登录时间
- 当用户单击注销按钮时创建注销时间
- 持续时间是注销 - 登录时间。(注销减去登录)
但问题是,如果用户没有点击注销按钮怎么办。以下是情况:
- 网络丢失
- 关闭浏览器/选项卡。(我需要这个必须使用javascript,但我不知道怎么做,知道吗?)
编辑:
我忘了在问题中添加一些内容,该程序是一个完整的 Flash 程序,没有导航到其他页面。只有 1 页
重要的是要记住 PHP 中的所有会话/登录功能通常都是基于 cookie 的。因此,更改会话 cookie 的生命周期应该可以解决您的问题:
http://us3.php.net/manual/en/function.session-set-cookie-params.php
此外,您可以设置 PHP 会话,使其仅使用 cookie:
http://us2.php.net/manual/en/session.configuration.php#ini.session.use-only-cookies
同样,您可以关闭浏览器窗口/选项卡,但是......为什么?例如,我可能会在多个选项卡中打开您的网站。如果我关闭这些选项卡之一,我应该自动退出您的网站吗?这是一个非常糟糕的设计。相反,设置会话生命周期,使其在浏览器关闭时过期,而不仅仅是一个选项卡。(另请注意,当您网站上的任何window.unload窗口关闭时会注销- 包括弹出窗口或 iframe。您真的想要吗?)
http://us2.php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime
如果您想将会话状态存储在数据库中,请尝试这些指南中的任何一个 。或者,使用session_set_save_handler自己动手
关于关闭浏览器/选项卡,您可以绑定unload事件(window.onunload、jQuery$(window).unload(fn)或任何其他事件)以通知您的服务器。更通用的解决方案是定期 ping 您的服务器(例如,每 5 分钟一次),但这可能会让用户感到厌烦,因此请谨慎行事。
如果用户只是关闭浏览器或从 Internet 上消失,您不能依赖接收用户注销的事件。
在这种情况下,您必须设置某种会话超时,并在您的应用程序意识到他们的会话太旧时记录注销。
如果这是一个真正的要求,那么我会说您需要一个“cron”作业来监控会话是否超时。当会话超时时,如果已登录,它会为该用户记录一个“注销”事件。
请注意,您不能使用(例如)ASPNET 的 Session_End 事件,因为它也不会被可靠地调用(例如,如果服务器进程重新启动)。
另一种选择是在用户下次登录时添加注销时间 - 当他们登录时,您检查旧会话并假设任何未关闭的会话自上次页面命中以来持续了固定时间。
这就是你所能做的。