会话跟踪

时间:2015-06-21 18:01:40

标签: java javascript jquery html5

我有一个要求,我希望用户只能在一台机器上登录他的ID。我想在db中使用一个像isLoggedIn = true或false的标志。因此,下次用户从其他机器登录时,我会去检查他在DB中的凭据,如果会话已经打开,我也可以检查该标志。

这种方法的缺点是在注销时我必须每次都去数据库并将该标志设置为false。是否有更好的方法,我不必去服务器端,只能在客户端验证它,如果它是一个不同的机器,但相同的用户ID?

先谢谢

2 个答案:

答案 0 :(得分:0)

您的方案有一个重要问题 - 如果客户"忘了"更新db(将您的布尔变量设置为false) - 您无法在下次登录 - 例如,如果客户端出现电源故障并且硬重启/关闭,则可能会发生这种情况。

更好的方法(但不完美) - 您可以保存客户的IP地址。

答案 1 :(得分:0)

强制执行此严厉规则的唯一合理方法是在服务器端。想一想:拥有一个客户了解其他客户存在的架构并不完全安全;让客户了解其他客户当前的登录状态或活动更糟糕。应该了解所有客户的唯一一方是服务器。

为数据库中的每个用户设置“登录”标志是有问题的,因为忘记注销的用户将永远无法再次登录。

然而,这个严苛要求的两个潜在解决方案:

  1. 在用户登录时存储客户端的lastActiveTimeIPport。在客户端代码中,定期对服务器进行“保持会话活动”调用以更新lastActiveTime。如果另一个客户端尝试使用具有不同IP和端口的相同用户帐户登录或执行操作,请拒绝它,直到lastActiveTime超过阈值时间(例如,10分钟后)。注销后或第一个客户端超时后,请清除客户端的lastActiveTimeIPport,以便让该过程重新开始。

  2. 存储客户端的IP和端口。当另一个客户端敲门而不是让他等待另一个客户端超时时,踢出第一个客户端 - 停止并清除用户会话,与第二个客户端开始一个新的会话。