2

构建 Web 应用程序。

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

对于这一部分:我选择使用带有元组列表(资源、当前用户)的 MySQL 表,并运行一个 cron 任务来删除过期的元组。

现在我希望能够通知 UserA UserB 想要访问 Resource1,如果 UserA 没有回答,那么 UserA 失去了对 Resource1 的锁定,然后资源对 UserB 可用。

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

用户的浏览器定期进行 AJAX 调用(比如说每分钟)以证明他还活着,并且在调用时,如果另一个用户请求了相同的资源,他必须在给定的时间内挑战服务器请求(例如验证码)。如果挑战失败,则意味着用户不再在这里(可能他的浏览器一直处于打开状态或网页没有聚焦)。

棘手的部分是:“他必须在给定的时间内挑战服务器请求(例如验证码)”。怎么做?

我是否遵循最佳路径?

4

3 回答 3

1

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

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

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

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

于 2017-10-24T17:47:53.013 回答
0

我会使用网络套接字来控制所有需要获取资源的用户。通过这种方式,您将知道谁已连接并使用该资源,当他完成使用时,您可以让下一个用户使用资源等等,(这样可以告诉每个用户估计他需要多长时间才能获得资源并做一些进度条)

于 2017-10-24T04:44:29.297 回答
0

我认为这里有两个问题。

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

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

于 2017-10-24T16:20:30.673 回答