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

2022-09-01 17:22:14

假设我单击网页上的按钮以启动提交请求。然后我突然意识到我提供的一些数据是错误的,如果它被提交,那么我将面临不必要的后果(比如购物请求,我可能会被迫为此不正确的请求付费)。

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

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

我用Java编写代码。Java是否有任何特殊功能,我们可以用它来检测STOP请求并回滚我们作为此事务的一部分所做的一切?


答案 1

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

  1. 当服务器可用时,浏览器发送 HTTP 请求
  2. 服务器执行代码(对于动态页)
  3. 服务器发送 HTTP 响应(通常是 HTML)
  4. 浏览器呈现 HTML,并要求提供其他文件(图像、css 等)

浏览器对“停止”的反应取决于您当时请求的步骤:

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

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


答案 2

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

PHP 在内部维护与客户端的连接状态。可能的值为正常、中止和超时。虽然连接状态为 NORMAL,但生存期良好,脚本将继续按预期执行。

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

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

查看 PHP 手册中关于连接处理的条目,了解如何避免此行为导致的复杂情况:

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


推荐