0

我在登录用户关闭浏览器时遇到问题。由于浏览器关闭,我的代码无法运行,因此它们的登录状态无法在数据库中更新为“N”。此外,由于会话被破坏,他们无法返回主页,因为我有此代码if (!isset($_SESSION['logged in'])) {等,以防止人们在未登录的情况下查看任何页面。

当用户登录时,他们的登录状态更改为“Y”,我记录他们登录的时间。我记录他们在每次页面加载时的最后活动时间。如果用户在页面上闲置 20 分钟,我会将用户重定向到登录页面并更改其登录状态。由于浏览器关闭问题,我还有一个 cron 作业,该问题每 5 分钟运行一次,并检查用户上次活动是否超过 20 分钟,如果是,他们的登录状态变为“N”

我认为由于浏览器关闭,用户必须等待 20 分钟以上才能重新登录,所以我希望能够立即再次登录。

我已经阅读了有关 javascript 的卸载功能,但显然它是不可靠的。

我还有其他方法可以解决这个问题吗?

4

2 回答 2

1

您需要更改会话 cookie 的持续时间,以便它们在浏览器窗口保持打开时持续存在;这样做session_set_cookie_params,将生命周期设置为0. 不要忘记确保您的 cron 脚本和 PHP 的会话 gc max 生命周期不会在 20 分钟过去之前删除会话。

由于您记录了他们的最后访问时间并在每个请求上进行检查,因此您可以在 20 分钟不活动后继续注销他们(只需破坏他们的会话并重定向到登录页面)。

于 2012-11-27T10:00:34.887 回答
1

关闭浏览器始终是客户端操作。因此,您将需要 javascript 将操作发送到服务器,以便 PHP 执行某些操作。

可以使用 onbeforeunload 向服务器发送一些东西,但确实不可靠。一种更可靠的方法是使会话时间更短(例如:2 分钟),然后每 30 秒对服务器进行一次 ajax 调用以保持会话处于活动状态(确保其页面对服务器/连接的影响非常小) . 如果请求失败 4 次,则会话被销毁。现在您的 cronjob 可以每 2 分钟运行一次,用户只需等待那么长时间。

另一种方法是使用 GUID 在用户计算机上存储 cookie,并使用“Logged ='Y'”将其保存在数据库中。现在,当有人尝试登录已登录的帐户时,请检查其是否为同一用户(cookie),如果是,则允许。这仍然使一个用户可以登录两次,只是更难而且不是错误的。

于 2012-11-27T10:09:53.283 回答