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

时间:2008-09-26 07:14:21

标签: java browser

假设我单击网页上的按钮以发起提交请求。然后我突然意识到我提供的一些数据是错误的,如果它被提交,那么我将面临不必要的后果(类似于购物请求,我可能会被迫支付这个错误的请求)。

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

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

我用Java编写代码。 Java是否有任何特殊功能可用于检测STOP请求并回滚我们在此事务中执行的任何操作?

5 个答案:

答案 0 :(得分:21)

来自浏览器的网页加载通常是一个4步骤(不考虑重定向):

  1. 当服务器可用时,浏览器发送HTTP请求
  2. 服务器执行代码(用于动态页面)
  3. 服务器发送HTTP响应(通常是HTML)
  4. 浏览器呈现HTML,并要求其他文件(图片,css,...)
  5. 浏览器对“停止”的反应取决于您当时的请求步骤:

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

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

答案 1 :(得分:12)

由于这个问题可能引起不使用Java的人的注意,我想我会提到关于这个问题的PHP行为,因为它非常令人惊讶。

PHP内部维护与客户端的连接状态。可能的值为NORMAL,ABORTED和TIMEOUT。虽然连接状态为NORMAL,但生活仍然良好,脚本将继续按预期执行。

如果用户在浏览器中单击“停止”按钮,则客户端通常会关闭连接,状态将更改为“已解除”。将状态更改为ABORTED将立即结束正在运行的脚本的执行。另外,当状态更改为TIMEOUT时会发生同样的事情(超出允许的脚本运行时的PHP设置)。

这种行为在某些情况下可能有用,但有些情况可能会有问题。似乎在适当的GET请求期间随时中止应该是安全的;但是,在服务器上进行更改的请求中间中止可能导致仅部分完成更改。

查看PHP手册中有关连接处理的条目,了解如何避免此行为导致的并发症:

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

答案 2 :(得分:3)

一般来说,服务器不会知道您已经停止,服务器端进程将完成。在服务器尝试将响应数据发送回客户端时,可能看到错误,因为连接已关闭,但您可能不会。你不会得到的是服务器线程突然中断。

您可以使用各种复杂的机制来缓解这种情况,例如让发送频繁的ajax调用发送到“仍在等待”的服务器,并让服务器在检查这些调用的新线程中执行其处理,但这不会完全解决问题。

答案 3 :(得分:1)

客户端将立即停止传输数据并关闭其连接。您的请求中有9次中有9次已经通过(可能是由于OS缓冲区被“刷新”到服务器)。不会向服务器发送额外信息,通知您已停止请求。

答案 4 :(得分:0)

您在重要方案中的提交应分为两个阶段。验证并提交。如果最终提交,则进行任何转移。除了允许用户在提交后撤消其操作之外,我无法想到任何其他方式来避免这种情况。例如,订单示例,在订单完成后,允许您的客户改变主意并在订单尚未发货的情况下修改订单。当然,你需要写一些额外的代码来编写。