通过 HTTP 跟踪用户存在(在线/离线)的最大问题是如何确定用户何时离线。
很容易确定用户何时上线 - 仅存在经过身份验证的请求就假定用户处于活动状态。但是,由于 HTTP 是无状态的,因此缺少后续请求可能意味着用户离线,或者用户在线,但最近没有对您的应用程序执行任何特定操作。
因此,您可以做出的最佳猜测是超时,如果用户在该超时期间没有发出请求,则切换到离线状态。
正如 Jonathan Sampson 建议的那样,最简单的实现是拥有 lastTimeActive。但是,这不会为您提供用户会话的长度,而只是估计此时谁在线。
更复杂的方法是使用 lastTimeActive 和 lastTimeLoggedIn。LastTimeLoggedIn 设置在距离上一个身份验证请求超过 5 分钟的第一个身份验证请求时。如果在最后五分钟内有经过身份验证的请求,则认为用户在线。用户的会话长度是 lastTimeActive 和 lastTimeLoggedIn 之间的时间差。
如果您的应用程序还提供了向用户注销的选择,您可以认为该操作也将离线。但是,除非您的应用程序是银行应用程序,否则用户很可能会关闭浏览器。
Also, avoid any background threads for updating the offline/online status of your users. You should be running the logic above only when there's an explicit request about the status of particular user and you should be updating only the users you were asked for.