Что происходит, когда я нажимаю кнопку «Стоп» в браузере? - PullRequest
25 голосов
/ 26 сентября 2008

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

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

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

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

Ответы [ 5 ]

21 голосов
/ 26 сентября 2008

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

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

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

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

Сам HTTP-вызов всегда является двухэтапным действием (запрос / ответ), и нет автоматического способа откатить выполнение с клиента

12 голосов
/ 23 марта 2010

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

PHP внутренне поддерживает состояние соединения с клиентом. Возможные значения: NORMAL, ABORTED и TIMEOUT. Пока состояние соединения НОРМАЛЬНОЕ, срок службы хорош, и сценарий будет продолжать выполняться, как и ожидалось.

Если пользователь нажимает кнопку «Стоп» в своем браузере, клиент, как правило, закрывает соединение, и статус изменяется на «Прервано». Изменение статуса на ABORTED немедленно прекратит выполнение запущенного скрипта. Кроме того, то же самое происходит, когда статус изменяется на TIMEOUT (превышен параметр PHPs для допустимого времени выполнения сценариев).

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

Проверьте запись руководства PHP по обработке соединений, чтобы узнать, как избежать осложнений, вызванных этим поведением:

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

3 голосов
/ 26 сентября 2008

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

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

1 голос
/ 26 сентября 2008

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

0 голосов
/ 26 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...