Предотвращение двойного HTTP POST

20
задан JJJ 20 July 2012 в 12:00
поделиться

9 ответов

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

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

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

22
ответ дан 29 November 2019 в 23:00
поделиться

Большинство ответов до сих пор было клиентским. На серверной стороне можно генерировать скрытое поле с GUID, когда Вы сначала производите форму и затем записываете тот GUID как отправленную форму, когда сообщение получено. Проверьте его прежде, чем сделать больше обработку.

20
ответ дан 29 November 2019 в 23:00
поделиться

Решение стороны пользователя состоит в том, чтобы отключить кнопку представления с помощью JavaScript после первого щелчка.

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

, Но, это не будет никогда заменять реальную проверку серверной стороны.

4
ответ дан 29 November 2019 в 23:00
поделиться

Клиентские методы полезны, но можно хотеть связать его с некоторыми серверными методами.

Один способ сделать это должно включать уникальный маркер в форму (например, GUID или подобный), так, чтобы, когда Вы приезжаете для обработки формы, можно было проверить, чтобы видеть, использовался ли маркер уже, предотвращая двойное представление.

В Вашем случае, если у Вас есть таблица с посетителями события, Вы могли бы включать этот маркер как столбец.

3
ответ дан 29 November 2019 в 23:00
поделиться

Решение только для клиента не будет достаточно, как указано во многих ответах здесь. Необходимо пойти с отказоустойчивой серверной стороной.

часто пропускаемая причина, что отключение кнопки отправки не работает, пользователь может просто обновить отправлять цель (и нажать "OK" на, "действительно ли Вы уверены, что хотите повторно отправить данные POST?" диалоговое окно). Или даже, некоторые браузеры могут неявно перезагрузить отправленную страницу, когда Вы пытаетесь сохранить страницу на диск (например, Вы пытаетесь сохранить бумажную копию подтверждения заказа).

3
ответ дан 29 November 2019 в 23:00
поделиться

Клиентское изменение является общей техникой:

  • Отключают Изменение кнопки отправки
  • экран к, "ожидайте" экран
  • , Если форма была модальна, возвратив экран к их обычному процессу (это обладает преимуществом того, чтобы заставлять вещи выглядеть действительно гладким)

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

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

0
ответ дан 29 November 2019 в 23:00
поделиться

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

0
ответ дан 29 November 2019 в 23:00
поделиться

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

0
ответ дан 29 November 2019 в 23:00
поделиться

Almost no one has js disabled. Think about coding your e-commerce website for the 70 year old woman who double clicks every link and button. All you want to do is add a javascript to prevent her clicking "Order Now" twice. Yes - check this at the server side too "be defensive" - but don't code for that case. But for the sake of a better UI do it on the client side too.

Here are some scripts that I found:

//
// prevent double-click on submit
//
  jQuery('input[type=submit]').click(function(){
    if(jQuery.data(this, 'clicked')){
      return false;
    }
    else{
      jQuery.data(this, 'clicked', true);
      return true;
    }
  });

and

// Find ALL <form> tags on your page
$('form').submit(function(){
    // On submit disable its submit button
    $('input[type=submit]', this).attr('disabled', 'disabled');
});
1
ответ дан 29 November 2019 в 23:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: