F5 (обновить) действует как представить - PullRequest
4 голосов
/ 09 октября 2011

У меня есть скрытый параметр, называемый «act», который должен передать одно из значений «load», «save» при нажатии кнопки подтверждения.

Проблема заключается в нажатии кнопки F5 (обновить) после нажатия кнопки отправки, поскольку URL-адрес уже содержит «& act = save», поэтому при нажатии на F5 фактически передается (в cgi) значение «save» снова (и выполняется действие сохранения снова, даже если я не нажал кнопку отправки.

Вопрос в том, как запретить отправку «& act = save» при нажатии кнопки «Обновить»?

Спасибо


Спасибо вам всем, но кнопка «Отправить» - это кнопка «Сохранить». Это означает, что я хочу оставить пользователю возможность выполнять дополнительное сохранение, поэтому не хочу покидать страницу. По этой причине я не думаю, что сеанс может помочь отличить второе сохранение или первое обновление.

Ответы [ 3 ]

6 голосов
/ 09 октября 2011

Основная проблема заключается в том, что вы используете GET, когда вы должны использовать POST. Спецификация HTTP гласит: :

В частности, было установлено, что методы GET и HEAD НЕ ДОЛЖНЫ иметь значение действия, отличного от извлечения.

Если вы используете POST, то браузер, по крайней мере, предупредит вас о повторной отправке формы.

Чтобы избежать даже этого, используйте шаблон POST-Redirect-GET .

2 голосов
/ 09 октября 2011

Вы не можете реально запретить пользователю нажимать F5 или запретить повторную загрузку страницы при повторной загрузке страницы - даже использование метода POST в форме позволит пользователю повторно отправить данные .

Две общие вещи, чтобы преодолеть это:

  1. Используя переменную Session, установите ее в первой отправке формы, затем проверьте ее - если она существует, это означает, что форма уже отправлена, поэтому просто проигнорируйте ее или оставьте пользовательское сообщение.

  2. После успешной отправки, перенаправьте пользователя на другую страницу. Таким образом, нажав F5 , вы перезагрузите эту новую страницу и не отправите данные повторно.

0 голосов
/ 10 октября 2011

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

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

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