Подтвердить что ты не робот

Что происходит, когда я нажимаю кнопку "Стоп" в браузере?

Скажем, я нажимаю кнопку на веб-странице, чтобы инициировать запрос на отправку. Затем я внезапно осознаю, что некоторые данные, которые я предоставил, ошибочны и что если он будет отправлен, то я столкнусь с нежелательными последствиями (что-то вроде запроса на покупку, где я могу быть вынужден заплатить за этот неправильный запрос).

Итак, я отчаянно нажимаю кнопку "Стоп" не один раз, а много раз (на всякий случай).

Что происходит в таком сценарии? Браузер просто отменяет запрос без уведомления сервера? Если в случае, если он информирует сервер, сервер просто убивает процесс или выполняет ли он какой-либо откат всех действий, выполненных как часть этого запроса?

Я код на Java. Есть ли у Java какая-либо специальная функция, которую мы можем использовать для обнаружения запросов STOP и отката в том, что мы сделали в рамках этой транзакции?

4b9b3361

Ответ 1

Загрузка веб-страницы из браузера обычно выполняется в 4 шага (не учитывая перенаправления):

  • Браузер отправляет HTTP-запрос, когда сервер доступен
  • Сервер выполняет код (для динамических страниц)
  • Сервер отправляет HTTP-ответ (обычно HTML)
  • Браузер отображает HTML и запрашивает другие файлы (изображения, css,...)

Реакция браузера на "Стоп" зависит от шага, который ваш запрос в это время:

  • Если ваш сервер работает медленно или перегружен, и вы нажимаете "Стоп" во время шага 1, ничего не происходит. Браузер не отправляет запрос.
  • В большинстве случаев "Стоп" будет нажат на шаги 2, 3 и 4, и на этих этапах ваш код уже будет выполнен, браузер просто перестает ждать ответа (2) или получает ответ (3) или отрисовкой ответа (4).

Сам HTTP-вызов - это всего лишь 2 шага (запрос/ответ), и нет автоматического способа отменить выполнение с клиента

Ответ 2

Поскольку этот вопрос может привлечь внимание людей, не использующих Java, я думал, что я бы упомянул поведение PHP в отношении этого вопроса, так как это очень удивительно.

PHP внутренне поддерживает статус подключения к клиенту. Возможные значения: NORMAL, ABORTED и TIMEOUT. Пока состояние соединения NORMAL, жизнь хорошая, а script будет продолжать выполняться, как ожидалось.

Если пользователь нажимает кнопку "Стоп" в своем браузере, соединение обычно закрывается клиентом, а статус изменяется на ABORTED. Изменение статуса на ABORTED немедленно прекратит выполнение текущего script. В стороне, то же самое происходит, когда статус изменяется на TIMEOUT (значение PHP для допустимого времени выполнения скриптов превышено).

Такое поведение может быть полезно при определенных обстоятельствах, но есть и другие, где это может быть проблематично. Кажется, что в любое время при правильном запросе GET должно быть безопасно отменять; однако прерывание посередине запроса, делающего изменения на сервере, может привести только к частично завершенным изменениям.

Ознакомьтесь с руководством по PHP в разделе "Управление подключением", чтобы узнать, как избежать осложнений, возникающих в результате этого поведения:

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

Ответ 3

Вообще говоря, сервер не будет знать, что вы нажали stop, и процесс на стороне сервера завершится. В тот момент, когда сервер пытается отправить данные ответа клиенту, вы можете увидеть сообщение об ошибке, потому что соединение было закрыто, но в равной степени вы не можете. То, что вы не получите, - это то, что серверный поток внезапно прерывается.

Вы можете использовать различные сложные механизмы, чтобы смягчить это, например, чтобы отправить отправить частые вызовы ajax на сервер, которые говорят "все еще ждут", и сервер выполняет свою обработку в новом потоке, который проверяет эти вызовы, но это doesn полностью решить проблему.

Ответ 4

Клиент немедленно прекратит передачу данных и закроет их соединение. 9 из 10 раз ваш запрос уже прошел (возможно, из-за того, что буферы ОС "краснеют" на сервер). Никакая дополнительная информация не отправляется на сервер, информируя ее о том, что вы остановили свой запрос.

Ответ 5

Ваша передача в важных сценариях должна состоять из двух этапов. Проверьте и отправьте. Если окончательная подача идет, то вы совершаете любые tranactions. Я не могу думать о другом способе, чтобы избежать этой ситуации, кроме как позволить вашему пользователю отменить свои действия после фиксации. например, пример заказа, после того, как заказ сделан, чтобы ваши клиенты могли изменить свое мнение и заблокировать заказ, если он еще не отправлен. Конечно, его дополнительный код, который вам нужно написать, чтобы сделать это.