2

我正在开发一个 Spring MVC 应用程序。我遇到了一个有趣的案例。

为了更容易解释,我以顶部的 stackover 流程​​按钮为例(我的意思是那些问题、标签、用户、徽章、未回答的按钮)。

现在在我的应用程序中,我有类似的按钮。当用户单击任何按钮时,它会通过传递适当的参数进行 ajax 调用。服务器进行 sql 查询并返回结果。

现在假设有一个像我这样的疯狂用户,不停地点击这些按钮。所以每次点击都会进行一次ajax调用。哪个完成了它的操作就会出现在前端。因此,即使用户最后点击标签按钮,它也可能会出现,并且再次点击需要很长时间才能返回前端的问题可能会覆盖页面。我该如何解决?(我希望显示标签数据,因为它是用户最后一次点击)

首先,我知道当用户首先点击问题然后点击标签时,我不再需要查询 sql 的问题按钮。有什么方法可以让我停止处理问题按钮的 sql 查询。

谢谢

4

3 回答 3

2

处理此问题的最佳方法是通过用户界面 - 如果用户采取了需要在后端进行大量处理的操作(单击图像),您的 UI 应阻止页面上的其他操作向后端发送更多消息,直到原始请求已完成。

从视觉上解决这个问题的方法是禁用/灰显其他元素,使某些工作明显正在进行(使用微调器、进度条)等。

在服务器端,由于每个 HTTP 请求都是独立的,因此在服务器上添加逻辑以检测发出当前请求的用户是否有另一个正在进行的请求当前正在处理是很麻烦和困难的。

于 2013-04-24T18:38:52.890 回答
1

您可能需要借助 cookie。当第一次操作完成时,写一些 cookie。每次,在处理之前检查该 cookie。

您不能简单地禁用 UI 中的链接或按钮,并希望用户不能这样做。它总是可以通过多种方式完成。必须进行额外检查。

(我还没有完全阅读你的帖子。但是从我从第一个答案中了解到的......)

于 2013-04-24T19:07:40.253 回答
1

我有一个类似的问题,我是这样解决的。

我做了手工编码的ajax调用(与jQuery等相反)

我有一个全局 XMLHTTPRequest。

var xhr = new XMLHTTPRequest();

当用户单击需要 ajax 调用的某些内容时,如果已在运行,我会中止先前的调用。

if( xhr.readystate !=0 || xhr.readystate !=4 )
   xhr.abort();

然后创建一个新的 XHR 实例,然后做你的事情。

xhr = new XMLHTTPRequest();
xhr.open("GET", myUrl, true);
//attach callback function etc and do the send
于 2013-04-24T20:24:33.833 回答