我使用 PHP 5.4.36、Apache/2.2.15、CakePHP 2.5.6。
当访问者单击"登录"按钮时,我会检查会话数据。
- 如果用户已经登录,我会将用户重定向到成员部分。
- 如果用户未登录,但用户有登录记住cookie,我也会将用户重定向到成员部分。
- 如果用户未登录,没有记住我的cookie,我会将用户重定向到登录表单。
- 如果用户未登录,则存在记住我的cookie,但没有会话ID cookie和会话文件,我将创建新的会话和会话cookie。
因此,对于最后一种情况,有时用户可以同时打开 2 个登录页面。
在这种情况下,将打开 2 个选项卡。
- 第一个选项卡:与服务器连接,不存在会话,不存在会话 ID cookie,记住我 cookie 存在。创建新的会话文件,创建会话 ID cookie 并登录用户。
- 第二个选项卡:与服务器连接,未找到会话,未找到会话 ID cookie,查找"记住我"cookie。由于第一个选项卡仍尝试登录,并且未创建会话文件和会话 ID cookie,因此将创建新会话。
这两个选项卡之间的请求时间接近 0.5-1.5 秒。如果差异超过2秒,则不存在问题。
此问题在 1 个请求中变为 1000 次,但是否可以禁用此问题?
编辑:
我不希望用户同时使用不同的用户名登录。我希望用户只登录 1 次。但在这种情况下,使用相同的凭据创建了 2 个会话。所以系统使用最后一个会话。上一个会话变得多余。此外,我的数据库记录显示了两种不同的登录名,尽管用户只登录了一次。
我们根据同一会话限制多次登录,但这远非完美。
除了会话之外,我们还有一个模型,用于跟踪:user_id,session_id,user_agent,IP。 如果用户有超过 1 条记录匹配 4 个匹配中的 3 个,我们假设这是双窗口错误并杀死会话。
这不是完美无缺的,但对我们来说没问题,如果它仍然困扰着你,你可能想按照这些思路实现一些东西。