Grails:在服务器端检测请求中止(ajax,escape,reload)

Posted

技术标签:

【中文标题】Grails:在服务器端检测请求中止(ajax,escape,reload)【英文标题】:Grails: detect request abort (ajax, escape, reload) on server-side 【发布时间】:2012-07-08 17:18:27 【问题描述】:

我有一个在多个边缘使用 ajax 的 grails 应用程序。

我通过 ajax 触发大型计算 (client -> controller -> service -> controller -> client),有时对所有当前正在运行的请求调用 abort()。 (例如,如果用户更改了某些参数)

现在的问题是,当我在我的 ajax 请求上调用 abort() 时,这些请求确实在客户端停止(完美!),但服务器一直在计算那些中止的请求 - 它不知道用户已中止,进一步处理无用

我搜索了一种方式/插件等来告诉服务器“嘿,停止此请求,不再需要它”,但没有找到解决方案。

关于我如何解决这个问题或其他人如何处理这个问题的任何想法?

【问题讨论】:

重复 - ***.com/q/2652082/104380 【参考方案1】:

我怀疑有比向服务器发送另一个 ajax 请求并让控制器“停止”服务中的预览处理更简单的方法。

检查这个问题:How to cancel ajax request that has run (on server side)

【讨论】:

嗯,我已经这么认为了。在我的情况下,发送一个额外的请求是没有问题的。但是如何告诉 grails/tomcat 然后取消来自该客户端的先前请求?【参考方案2】:

正如其他人所说,要让服务器停止处理请求,您无能为力。您可以施加一些控制的唯一地方是在您的服务中处理长时间运行的计算。

想到的一个解决方案是让计算服务检查某种指示它中止的标志,如果发现它被设置,那么它会立即返回或返回一些小的垃圾值,因为无论如何客户端都不再听了。

由于默认情况下服务是事务安全的(我认为),因此您必须小心以独立于事务的方式设置标志,这意味着会话和数据库(假设您使用的是事务关系数据库) 是禁区,因为您的服务不会看到后续“停止”请求所做的更改。相反,像 Redis 这样的东西可能是理想的,因为它是一个外部的、非事务性的、非常快速键值对数据存储。

作为“架构”示例,您基本上会有一个“停止”操作,为该特定用户或会话设置一个 redis 键,告诉计算停止。然后,您的计算服务会在它运行时检查该键,如果发现它已设置则停止处理。

还有其他(也许更好的)架构可以让你做这种事情,但考虑到你当前的系统,我认为这将是最简单的一种。

【讨论】:

以上是关于Grails:在服务器端检测请求中止(ajax,escape,reload)的主要内容,如果未能解决你的问题,请参考以下文章

在其他函数中中止 Ajax 请求

Django-ajax:CSRF 验证失败。请求中止

使用 jQuery 中止 Ajax 请求

如何防止AJAX服务器端传输?

当我在控制器功能中间中止或退出时,Ajax 请求被 Cors 阻止

中止请求时 IIS/C# 中会发生啥