Как препятствовать тому, чтобы форма отправила многократно от стороны клиента?

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

89
задан Dan Homola 6 August 2014 в 13:16
поделиться

9 ответов

Используйте ненавязчивый JavaScript, чтобы отключить событие отправки в форме после того, как оно уже было отправлено. Вот пример использования jQuery.

РЕДАКТИРОВАТЬ: Исправлена ​​проблема с отправкой формы без нажатия кнопки отправки. Спасибо, Ичибан.

$("body").on("submit", "form", function() {
    $(this).submit(function() {
        return false;
    });
    return true;
});
96
ответ дан 24 November 2019 в 07:12
поделиться

Я знаю, что вы пометили свой вопрос тегом «javascript», но вот решение, которое вообще не зависит от javascript:

Это шаблон веб-приложения с именем PRG и вот хорошая статья , описывающая это

4
ответ дан 24 November 2019 в 07:12
поделиться

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

edit: полагаться на javascript - не лучшая идея, поэтому вы все можете продолжать голосовать за эти идеи, но у некоторых пользователей это не будет включено. Правильный ответ - не доверять вводу пользователя на стороне сервера.

5
ответ дан 24 November 2019 в 07:12
поделиться

Используя JQuery, вы можете:

$('input:submit').click( function() { this.disabled = true } );

&

   $('input:submit').keypress( function(e) {
     if (e.which == 13) {
        this.disabled = true 
     } 
    }
   );
5
ответ дан 24 November 2019 в 07:12
поделиться

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

5
ответ дан 24 November 2019 в 07:12
поделиться

Вот простой способ сделать это:

<form onsubmit="return checkBeforeSubmit()">
  some input:<input type="text">
  <input type="submit" value="submit" />
</form>

<script type="text/javascript">
  var wasSubmitted = false;    
    function checkBeforeSubmit(){
      if(!wasSubmitted) {
        wasSubmitted = true;
        return wasSubmitted;
      }
      return false;
    }    
</script>
14
ответ дан 24 November 2019 в 07:12
поделиться

Отключить кнопку отправки вскоре после щелчка. Убедитесь, что вы правильно обрабатываете проверки. Также сохраните промежуточную страницу для всех операций обработки или БД, а затем перенаправьте на следующую страницу. Это гарантирует, что при обновлении второй страницы не будет выполняться другая обработка.

8
ответ дан 24 November 2019 в 07:12
поделиться
<form onsubmit="if(submitted) return false; submitted = true; return true">
15
ответ дан 24 November 2019 в 07:12
поделиться

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

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

С другой стороны, llimllib поднимает очень важный вопрос. Все формы должны проверяться на стороне сервера. Это включает в себя несколько проверок отправки. Никогда не доверяйте клиенту! Это не только случай, если отключен javascript. Вы должны иметь в виду, что весь код на стороне клиента можно изменять. Это довольно сложно представить, но html / javascript, обращающийся к вашему серверу, не обязательно является написанным вами html / javascript.

Как предлагает llimllib, сгенерируйте форму с идентификатором, уникальным для этой формы, и поместите ее в скрытое поле ввода. Сохраните этот идентификатор. При получении данных формы обрабатывать их только при совпадении идентификатора. (Также привязывая идентификатор к сеансу пользователя и сопоставляя его, также для дополнительной безопасности.) После обработки данных удалите идентификатор.

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

24
ответ дан 24 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

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