Java 会话超时时更新loggedIn状态

Java 会话超时时更新loggedIn状态,java,gwt,Java,Gwt,当用户登录到我的应用程序时,我会在数据库中将登录状态保存为该用户的“loggedIn”(因此不能从不同的计算机进行多次登录) 这对我来说很好,但在1个场景中,我面临这个问题 如果一个用户刚刚离开他的电脑离开,现在他正试图从另一台电脑登录。 但他在db中的登录状态仍然是“loggedIn”。因此,他无法从其他pc登录,除非他转到另一台pc(他以前登录过的地方)并注销 无论如何,我可以处理这个问题,理想的情况是当用户试图从其他位置尝试时,有一种方法可以自动从以前的pc/浏览器注销用户 当用户单击注销

当用户登录到我的应用程序时,我会在数据库中将登录状态保存为该用户的“loggedIn”(因此不能从不同的计算机进行多次登录)

这对我来说很好,但在1个场景中,我面临这个问题

如果一个用户刚刚离开他的电脑离开,现在他正试图从另一台电脑登录。 但他在db中的登录状态仍然是“loggedIn”。因此,他无法从其他pc登录,除非他转到另一台pc(他以前登录过的地方)并注销

无论如何,我可以处理这个问题,理想的情况是当用户试图从其他位置尝试时,有一种方法可以自动从以前的pc/浏览器注销用户

当用户单击注销链接时,我调用此方法,这会使会话无效,并调用db。。 我想做的是,当有一个不活动的2分钟,或者用户只是关闭他的浏览器(不注销)时,调用这个方法

试试这个

           DateTime lastAccessedTime = new DateTime(session.getLastAccessedTime());
    DateTime currentTime = new DateTime();
    Minutes diff =  Minutes.minutesBetween(currentTime, lastAccessedTime);
    if (diff.getMinutes()>1){
        logOut();
但是lastAccessedTime具有代码上次到达此行的时间

这一行:

         DateTime lastAccessedTime = new DateTime(session.getLastAccessedTime());

因此,它没有给出用户执行某项操作的实际时间,而是给出调用此行的时间。

处理此问题的一种方法是在存储登录状态的表中设置最后一个活动列,并用最后一个用户活动的时间戳填充此值。您可以在预定义的时间间隔内运行作业,通过计算当前时间和上次活动时间之间的差异,将状态设置为“loggedOff”。

您如何知道是同一个人从不同的机器登录?但是,如果没有采取任何行动,您可以设置一些计时器,使其在一段时间后自动注销。我将把他的凭据带到db,并检查他的登录状态是否为“LoggedIn”,这是我在他第一次成功登录时设置的。因此,如果该用户的登录状态为“LoggedIN”,我将不允许他登录。如果没有活动,请告诉我检查的方法,这是我之后的情况。这是我发现的最接近你的情况。我使用session.setMaxTimeInterval();但是db状态仍然存在,我想把db状态也设为loggedOut,如果没有,我从来没有实现过,但是如果你可以显示你的代码片段,那么它可以帮助解决你的问题。但是,当计时器到达时,您是否正在更改数据库状态?我正在使用session.lastActivity方法,但它是我调用此方法本身(“session.lastActivity”)的最后一次,请查看我更新的问题
         DateTime lastAccessedTime = new DateTime(session.getLastAccessedTime());