Java 会话跟踪

Java 会话跟踪,java,javascript,jquery,html,Java,Javascript,Jquery,Html,我有一个要求,我想用户登录与他的id只有一台机器上。我想在db中使用一个标志,比如isLoggedIn=true或false。所以下一次当用户从其他机器登录时,我去DB中检查他的凭据,如果会话已打开或未打开,我也可以检查标志 这种方法的缺点是,每次注销时,我都必须转到数据库并将该标志设置为false。有没有更好的方法,我不必去服务器端,只需要在客户端验证它,如果它也是不同的机器,但用户id相同 提前感谢您的场景有一个重要问题-如果客户端“忘记”更新db(将布尔变量设置为false)-您下次无法登

我有一个要求,我想用户登录与他的id只有一台机器上。我想在db中使用一个标志,比如isLoggedIn=true或false。所以下一次当用户从其他机器登录时,我去DB中检查他的凭据,如果会话已打开或未打开,我也可以检查标志

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


提前感谢

您的场景有一个重要问题-如果客户端“忘记”更新db(将布尔变量设置为false)-您下次无法登录-例如,在客户端出现电源故障和硬重启/关机的情况下,可能会发生这种情况


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

唯一可行的方法是在服务器端执行这一严厉规则。想想看:客户知道其他客户的存在的架构是不安全的;让客户端知道其他客户端的当前登录状态或活动更糟糕。唯一应该知道所有客户机的是服务器

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

然而,对于这一苛刻要求,有两种可能的解决方案:

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

  • 存储客户端的IP和端口。当另一个客户端敲门时,与其让他等待另一个客户端超时,不如踢出第一个客户端-停止并清除用户会话,与第二个客户端启动一个新会话