检查另一个用户使用的资源的可用性

Check availability of resource used by another user

构建网络应用程序。

用户可以通过浏览器访问服务器上的共享资源主机,但是如果 UserA 已经在使用 Resource1,则在 UserA 释放 Resource1 或给定的时间之前,UserB 不应使用 Resource1。

对于这部分:我选择使用 MySQL table 和元组列表 (resource,currentuser) 和 运行 cron 任务来删除过期的元组。

现在我希望能够通知用户 A 用户 B 想要访问资源 1,如果用户 A 没有回答,则用户 A 失去了对资源 1 的锁定,然后资源可供用户 B 使用。

对于这部分,我想我必须使用AJAX。我考虑过以下解决方案:

用户的浏览器定期 AJAX 调用(假设每分钟)以证明他还活着,并且在调用时,如果另一个用户请求了相同的资源,他必须在给定的时间(例如验证码)。如果挑战失败,这意味着用户已经不在了(可能他离开了他的浏览器打开或网页没有焦点)。

棘手的部分是:"he has to challenge a server request in a given amount of time (for example a captcha)"。怎么做?

我走的是最佳路径吗?

我会使用网络套接字来控制所有需要获取资源的用户。 这样你就会知道谁连接并使用了资源,当他用完它时你可以让下一个用户使用资源等等, (这种方式可以告诉每个用户估计他需要多少时间来获取资源并做一些进度条)

我认为这里有两个问题。

  1. 如何通知用户资源可用? 定期 AJAX 请求可能没问题,但您也可以考虑使用长轮询或 websockets 来接近实时通知等待用户。

  2. 如何知道用户还在使用资源? 如果你想捕捉人类用户没有在页面上做任何事情的时刻,你可以跟踪鼠标 movement/clicking 或键盘按钮的按下。如果最后 n 分钟未执行任何操作,则该页面可能被视为未激活。 如果你想确保该页面不被自动化软件利用,你可以要求在资源被使用时每n分钟填写一次验证码。

是的,你概述的很好。使用 ajax 也完全没问题,特别是如果您只是每分钟轮询一次。

例如,假设您有以下内容:

setInterval(function() {
 $.get('/resource/status', function(response) {
    if (response.data.newRequest) {
       //This would signal a new request to the resource
    }
 })
}, 60000)

在处理访问资源的新请求时,您可以使用 reCaptcha 之类的内容并以适当的方式显示(覆盖或内嵌)。当你这样做时,你也可以启动一个计时器来确定它是否超过了分配的时间量。如果有,那么您可以执行另一个 ajax 请求并撤销此人对该资源的访问权限,或者您希望如何处理。