单击浏览器上的"停止"按钮会发生什么?

时间:2020-03-06 14:46:10  来源:igfitidea点击:

假设我单击网页上的按钮以发起提交请求。然后,我突然意识到我提供的某些数据是错误的,如果提交了这些数据,那么我将面临不必要的后果(例如购物请求,可能会迫使我支付不正确的请求费用)。

因此,我疯狂地单击"停止"按钮不仅是一次,而是多次(以防万一)。

在这种情况下会发生什么?浏览器是否只是在不通知服务器的情况下取消了请求?如果确实通知服务器,则服务器只是终止该进程,还是对作为此请求一部分而执行的所有操作进行一些回滚?

我用Java编写代码。 Java是否具有可用于检测STOP请求并回滚作为此事务一部分的任何特殊功能?

解决方案

一般来说,服务器将不知道我们已经停止运行,并且服务器端过程将完成。服务器尝试将响应数据发送回客户端时,我们可能会看到错误,因为连接已关闭,但同样地,我们可能没有看到。我们将无法获得的是服务器线程突然被中断。

我们可以使用各种复杂的机制来减轻这种情况,例如让send向服务器发送频繁的ajax调用,说"仍在等待",并让服务器在检查这些调用的新线程中执行其处理,但这不能解决问题。问题完全。

客户端将立即停止传输数据并关闭其连接。请求中有10个中有9个已经通过(可能是由于OS缓冲区"掉入"了服务器)。没有额外的信息发送到服务器,通知它我们已停止请求。

我们在重要情况下的提交应分为两个阶段。验证并提交。如果最终提交成功,则我们将提交任何事务。除了允许用户在提交后撤消其操作之外,我无法想到其他任何方法来真正避免这种情况。例如订单示例,在完成订单后,客户可以改变主意并取消订单(如果尚未发货)。当然,我们需要编写额外的代码来支持suuport。

从浏览器加载网页通常是一个四步过程(不考虑重定向):

  • 服务器可用时,浏览器发送HTTP请求
  • 服务器执行代码(用于动态页面)
  • 服务器发送HTTP响应(通常为HTML)
  • 浏览器呈现HTML,并询问其他文件(图像,css等)

浏览器对"停止"的反应取决于我们当时请求的步骤:

  • 如果服务器运行缓慢或者过载,并且在步骤1中单击"停止",则不会发生任何事情。浏览器不发送请求。
  • 但是,在大多数情况下,第2、3和4步将被"停止",并且在这些步骤中,代码已经执行,浏览器仅停止等待响应(2)或者接收响应(3)。 ,或者呈现响应(4)。

HTTP调用本身始终是一个两步操作(请求/响应),并且没有自动的方法可以从客户端回滚执行

由于此问题可能会吸引那些不使用Java的人的注意,因此我想就此问题提及PHP的行为,因为这非常令人惊讶。

PHP在内部维护到客户端的连接状态。可能的值为NORMAL,ABORTED和TIMEOUT。在连接状态为NORMAL的情况下,运行状况良好,脚本将继续按预期执行。

如果用户单击浏览器中的"停止"按钮,则客户端通常会关闭连接,并且状态将更改为"已暂停"。将状态更改为ABORTED将立即终止正在运行的脚本的执行。顺便说一句,当状态更改为TIMEOUT时,也会发生相同的事情(超过了脚本允许的运行时的PHPs设置)。

此行为在某些情况下可能有用,但在其他情况下可能会出现问题。似乎在适当的GET请求期间随时中止是安全的;但是,在对服务器进行更改的请求中间中止可能只会导致部分完成更改。

查阅有关连接处理的PHP手册条目,以了解如何避免此行为引起的复杂性:

http://www.php.net/manual/zh/features.connection-handling.php