如何跟踪用户在线状态?

时间:2009-12-15 06:33:18

标签: usage-statistics

我想捕获以下参数:

lastAccessedTime - 用户最后一次访问该网站的时间(通常在登录过程中显示)

isOnline - 表示用户是否在线的布尔值。

一个。将这些变量作为User表本身的一部分或者是否应该通过单独的用户审计表处理它是否有意义?

湾如果某些SOAP / REST API通过API调用公开了这些功能,那么如何跟踪上述参数(例如,在这种情况下你会修改lastAccessedTime - 如果用户登录门户网站,这可能会让用户感到困惑,isOnline位也没有意义如果用户进行API调用。)

4 个答案:

答案 0 :(得分:6)

我会创建一个链接回用户的会话表。而不是isOnline字段,我只会对在最后x个时间内处于活动状态的会话运行查询。我还会使用每个请求更新该会话字段,即使该请求是通过API发送的。

这会在修剪会话表时产生一些开销,但您也不会使用非用户信息混乱您的用户表,这些信息无法修剪。

答案 1 :(得分:3)

将lastTimeActive设置为用户表中的一个字段,并在每次访问页面时对其进行更新。您的“在线用户”列表是lastTimeActive在5分钟内的所有用户。

答案 2 :(得分:1)

我会创建另一个表(userid,lastTimeActive),并经常更新&检查表。

// update
update onlineusers set lastTimeActive = getdate() where userid=1234

// check
delete from onlineusers where lastTimeActive < dateadd(minute,-5,getdate())

答案 3 :(得分:1)

通过HTTP跟踪用户状态(onine / offline)的最大问题是如何确定用户何时离线。

很容易确定用户何时上线 - 仅仅存在经过身份验证的请求就会假定用户处于活动状态。但是,由于HTTP是无状态的,缺少后续请求可能意味着用户已离线,或者用户已在线,但最近没有对您的应用做任何特定的事情。

因此,您可以做出的最佳猜测是超时,如果用户在超时期间没有发出请求,则切换到离线状态。

最简单的实现是拥有一个lastTimeActive,正如Jonathan Sampson建议的那样。但是,这不会给你用户会话的长度,只是当前在线人员的近似值。

更复杂的方法是使用lastTimeActive和lastTimeLoggedIn。 LastTimeLoggedIn在第一次授权请求时设置,该请求距离上一次授权请求超过5分钟。如果在过去五分钟内有经过身份验证的请求,则用户被视为在线。用户的会话长度是lastTimeActive和lastTimeLoggedIn之间的时差。

如果您的应用还提供了退出给用户的选择,那么您仍然会认为该操作也会脱机。但是,除非您的应用是银行应用,否则用户可能会关闭浏览器。

此外,请避免使用任何后台线程来更新用户的离线/在线状态。只有当有关于特定用户状态的明确请求时,您才应该运行上面的逻辑,并且您应该只更新您被要求的用户。