Первая страница содержит HTML-форму. Вторая страница - код, обрабатывающий отправленные данные.
Форма на первой странице будет отправлена. Браузер перенаправляется на вторую страницу. Вторая страница обрабатывает отправленные данные.
На этом этапе, если страница 2 будет обновлена, появится предупреждение «Подтвердить повторную отправку формы».
Можно ли это предотвратить?
Ответы:
Здесь есть 2 подхода:
Метод 1: используйте AJAX + Redirect
Таким образом, вы публикуете свою форму в фоновом режиме с помощью JQuery или чего-то подобного Page2, в то время как пользователь по-прежнему видит отображаемую page1. После успешной публикации вы перенаправляете браузер на Page2.
Метод 2: публикация + перенаправление на себя
Это распространенная техника на форумах. Форма на странице 1 отправляет данные на страницу 2, страница 2 обрабатывает данные и делает то, что нужно сделать, а затем выполняет перенаправление HTTP на себя. Таким образом, последнее «действие», которое запоминает браузер, - это простой GET на странице 2, поэтому форма не будет повторно отправлена после F5.
источник
Вам нужно использовать шаблон PRG - Post / Redirect / Get, и вы только что реализовали P PRG. Вам нужно перенаправить .(В наши дни вам вообще не нужно перенаправление. См. Это )PRG - это шаблон дизайна веб-разработки, который предотвращает дублирование отправки формы, что означает: форма отправки (запрос публикации 1) -> перенаправление -> получение (запрос 2).
Код состояния перенаправления - HTTP 1.0 с HTTP 302 или HTTP 1.1 с HTTP 303
HTTP-ответ с кодом статуса перенаправления дополнительно предоставит URL-адрес в поле заголовка местоположения. Пользовательский агент (например, веб-браузер) получает приглашение с помощью ответа с этим кодом сделать второй, в остальном идентичный, запрос на новый URL, указанный в поле местоположения.
Код состояния перенаправления гарантирует, что в этой ситуации браузер веб-пользователя может безопасно обновить ответ сервера, не вызывая повторной отправки начального запроса HTTP POST.
Источник
источник
Напрямую нельзя, и это хорошо. Предупреждение браузера есть не просто так. Эта ветка должна ответить на ваш вопрос:
Запретить кнопку "Назад" отображать предупреждение о подтверждении POST
Было предложено два ключевых обходных пути: шаблон PRG и отправка AJAX с последующим перемещением сценария.
Обратите внимание: если ваш метод позволяет использовать GET, а не метод отправки POST, то это решит проблему и лучше согласуется с соглашением. Эти решения предоставляются при условии, что вы хотите / нуждаетесь в данных POST.
источник
Единственный способ быть на 100% уверенным, что одна и та же форма никогда не будет отправлена дважды, - это встроить уникальный идентификатор в каждую форму, которую вы отправляете, и отслеживать, какие из них были отправлены на сервер. Проблема здесь в том, что если пользователь выполняет резервное копирование на страницу, где была форма, и вводит новые данные, та же форма не будет работать.
источник
Ответ состоит из двух частей:
Убедитесь, что повторяющиеся сообщения не портят ваши данные на стороне сервера. Для этого вставьте в сообщение уникальный идентификатор, чтобы вы могли отклонять последующие запросы на стороне сервера. В терминах обмена сообщениями этот шаблон называется идемпотентным получателем .
Убедитесь, что пользователя не беспокоит возможность дублирования документов обоими
Ничего из того, что вы делаете в соответствии со вторым этапом, не предотвратит дублирование отправки. Люди могут нажимать очень быстро, а хакеры в любом случае могут публиковать сообщения. Вам всегда нужен 1. если вы хотите быть абсолютно уверены в отсутствии дубликатов.
источник
Если вы обновите страницу с данными POST, браузер подтвердит вашу повторную отправку. Если вы используете данные GET, сообщение отображаться не будет. Вы также можете перенаправить вторую страницу после сохранения отправки на третью страницу без данных.
источник
Я обнаружил, что никто не упоминал об этой уловке.
Без перенаправления вы все равно можете предотвратить подтверждение формы при обновлении.
По умолчанию код формы такой:
<form method="post" action="test.php">
теперь измените его на
<form method="post" action="test.php?nonsense=1">
Вы увидите волшебство.
Я предполагаю, что это потому, что браузеры не будут запускать всплывающее окно с предупреждением о подтверждении, если оно получит метод GET (строку запроса) в URL-адресе.
источник
Вы можете сделать это с помощью jquery
Это самый элегантный способ предотвратить повторную отправку данных после отправки из-за обратной публикации.
Надеюсь это поможет.
источник
Шаблон PRG может предотвратить только повторную отправку, вызванную обновлением страницы. Это не 100% безопасная мера.
Обычно я предпринимаю следующие действия, чтобы предотвратить повторную отправку:
На стороне клиента - используйте javascript, чтобы предотвратить повторяющиеся нажатия на кнопку, которая запускает отправку формы. Вы можете просто отключить кнопку после первого нажатия.
Сторона сервера - я вычисляю хэш для представленных параметров и сохраняю этот хеш в сеансе или базе данных, чтобы, когда было получено дублированное представление, мы могли обнаружить дублирование, а затем получить правильный ответ клиенту. Однако вы можете создать хеш на стороне клиента.
В большинстве случаев эти меры могут помочь предотвратить повторную отправку.
источник
Мне очень нравится ответ @Angelin. Но если вы имеете дело с устаревшим кодом, где это нецелесообразно, этот метод может сработать для вас.
Вверху файла
Затем в конце формы наклеить
last_pos_sub
так:источник
Попробуйте трис:
Как использовать / пример:
Шрифт: https://www.tutdepot.com/prevent-multiple-form-submission/
источник
используйте js для предотвращения добавления данных:
источник