2008-09-26 12 views
24

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

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

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

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

ответ

3

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

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

1

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

+0

Если это происходит во время соединения живого ТСРА сервера, делает браузер отправить сброс ? – seand 2014-11-12 04:26:50

0

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

21
нагрузки

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

  1. браузер отправляет запрос HTTP, когда сервер доступен
  2. Сервер выполняет код (для динамических страниц)
  3. Сервер отправляет HTTP-ответ (обычно HTML)
  4. Browser визуализирует HTML и требующий для других файлов (изображений, CSS, ...)

Реакция браузера «Стоп» зависит от шага ваш запрос будет в то время:

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

Сам HTTP вызов всегда действие 2 шага (Request/Response), и нет автоматического способа откатить исполнение от клиента

12

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

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

Если пользователь нажимает кнопку «Стоп» в своем браузере, соединение обычно закрывается клиентом, а статус изменяется на «АВТОМАТИЧЕСКИЙ». Смена статуса на ABORTED немедленно прекратит выполнение скрипта. В стороне, то же самое происходит, когда статус изменяется на TIMEOUT (значение PHP для допустимого времени выполнения скриптов превышено).

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

Заканчивать запись в Руководстве по PHP на подключении Handling, чтобы увидеть, как избежать осложнений в результате такого поведения:

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

Смежные вопросы