如何检查用户是否已经登录?
这样,其他浏览器中的用户无法使用相同的帐户登录。
此外,这是一个好的解决方案吗?还是应该让用户在另一个浏览器中登录,然后注销当前用户并显示消息(您已从其他位置登录),就像Messenger一样?
在登录时生成一个随机令牌(或使用sessionid),并将其存储在数据库和用户的cookie中。每次访问页面时,请确保用户的令牌与数据库条目匹配。如果两者不匹配,请警告用户他们已经在其他地方登录。
您还可以存储登录时间,这将是分配令牌的时间,并要求在允许另一个用户使用相同ID登录之前等待30分钟。
$_SESSION['logged_in'] = true
。$_SESSION['logged_in']
以查看用户是否已登录。users
表格是不错的选择),指示用户的当前会话 ID(使用 session_id()
检索),如果它与您刚收到的 cookie 值不匹配,则立即为该 ID 调用 session_destroy()
,并将该用户视为已注销。$_SESSION
意味着您不必担心生成自己的令牌,并且可以利用内置的superglobals功能来存储有关用户身份验证状态的信息。关于如何检测多个用户,问题的前半部分已经得到了很好的回答,但是如何处理它们我认为还需要一些工作。
首先,如果一个用户正确登录,请让他们进入,不要阻止他们如果他们在其他地方登录。如果你真的不想让用户有两个打开的会话,那么就注销旧的会话或者简单地更新你保存的会话ID,这样你就可以弹出旧的连接。你可以通知用户,但我只会向无效的会话发送消息。如果你向登录的用户发送消息,当你只处理用户切换计算机并忘记注销旧会话的情况时,这将变得很烦人。
以上提到的所有解决方案都可以工作,但如果在每个页面访问时都调用数据库并检查会话令牌以查看它是否与分配给用户的相同令牌,则会降低响应时间。我建议使用缓存机制而不是上述解决方案中的数据库。将会话令牌存储到数据库中将为您的数据库添加额外的字段,实际上并不需要。使用开源缓存解决方案,如memcache。
你可以创建一个名为userLoginStatus的表,其中包含类似于clockIn time和clockOut time的字段,并在用户登录时将当前时间插入到clockIn中,同时将clockOut留空。只有当用户点击注销按钮时,才会更新clockOut时间。这样,你就可以检查特定用户的当前状态,其中clockOut为空的用户应该是已登录的,因为它只有在用户注销时才会更新。