在POST数据时 - 无论是使用AJAX还是从移动设备或者你拥有的东西 - 通常都会出现“重试”状态,所以如果超时发生故障,数据会再次发布。
这实际上是个好主意吗?
POST数据意味着是幂等的,所以如果你
如果在3之后的某个时间点击超时,那么下一次重试将发送意味着幂等的数据。
那么问题是,应该为POST数据设置重试(从客户端调用时),还是应该将服务器设计为始终正确处理POST数据(使用令牌等),或者我是否遗漏了某些内容?
根据问题更新 - 这适用于移动应用。碰巧的是,在测试过程中发现,如果超时太短,app会重试。同时,后端服务器实际上接受并处理了初始请求,并在新的(否则相同的)重新请求进入时获得了v。。
答案 0 :(得分:1)
nonce
是(部分)解决方案。服务器生成一个nonce并将其提供给客户端。客户端发送包含nonce的POST
,服务器检查nonce是否有效且未使用,如果是,则对POST
执行操作并使nonce无效,如果不是,则报告nonce是使用并丢弃数据。用户单击两次提交按钮也可以避免“双重帖子”问题。
然而,它正在将问题从客户端转移到服务器上的另一个问题。如果在操作之前使nonce无效,则操作可能仍会失败/挂起,如果之后使其无效,则nonce对于处理期间的请求仍然有效。因此,服务器上的可能情况变为接收。
Semaphores对此最有帮助,大多数后端语言都有这些库。
所以,实施所有这些:
答案 1 :(得分:0)
自动重试的问题是服务器需要知道先前的POST是否已成功处理以避免意外后果。例如,如果每个POST都插入一个DB记录,但最后一个POST在插入后超时,则自动重新POST将导致重复的DB记录,这可能不是您想要的。
在健壮的设置中,您可能会发现有超时并回滚任何POSTed更新。这将安全地允许自动重新POST。但是很多(大多数?)网络系统并不是那么复杂,所以你通常需要人工干预来确定POST是否应该再次发生。
答案 2 :(得分:0)
如果无法避免漫长的等待,直到服务器响应,更好的做法是返回立即响应(200OK,消息“处理”)并让客户端稍后发送一个新的检查请求如果行动已经完成。
AJAX并非旨在以这种方式使用(“重”动作)。 顺便说一下,默认的HTTP超时是7200秒,所以我认为你不会轻易达到它 - 但无论如何,你应该避免让用户等待很长一段时间。
提供有关流程的更多信息(例如您正在尝试做的事情)将有助于提出避免此类障碍的方法。
答案 3 :(得分:0)
如果您的请求失败足以煽动此类内容,则您遇到的主要问题与实施重试条件无关。我从未见过需要此类功能的Web应用程序。使用F5锤子对您的应用程序进行编程以自动击败过载的服务器不是任何解决方案。
如果通过单击按钮触发此ajax请求,请禁用该按钮,直到它返回,成功与否。如果失败,请让用户再次单击它。