5

我想捕获以下参数:

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

isOnline - 一个布尔值,表示用户是否在线。

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

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

4

4 回答 4

7

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

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

于 2009-12-15T06:38:16.877 回答
5

使 lastTimeActive 成为用户表中的一个字段,并在每次访问页面时更新它。您的“在线用户”列表是所有 lastTimeActive 在 5 分钟内的用户。

于 2009-12-15T06:36:00.013 回答
2

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

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

// check
delete from onlineusers where lastTimeActive < dateadd(minute,-5,getdate())
于 2009-12-15T06:41:18.940 回答
2

通过 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.

于 2009-12-15T07:30:21.697 回答