Как избежать вставки двух одинаковых записей дважды при двойном нажатии на кнопку отправки?

У меня есть всплывающее окно, где есть два метода onclick как "Отправить" и "Отменить".

Когда я дважды нажимаю "Отправить", он вставляет две записи, что означает дублирование записи.

Как я могу избежать этого?

2 ответа

Предотвращение двойной отправки является распространенной проблемой.

Несмотря на то, что есть много решений для этого, так как вы пометили его Struts2, есть два способа, предоставляемых платформой из коробки для обработки двойной отправки:

  • Токен-перехватчик

    Возвращает invalid.token результат, который, например, может быть сопоставлен с ошибкой:

    Гарантирует, что обрабатывается только один запрос на каждый токен. Этот перехватчик может убедиться, что кнопки "назад" и двойной щелчок не вызывают непреднамеренных побочных эффектов. Например, вы можете использовать это для предотвращения неосторожных пользователей, которые могут дважды щелкнуть по кнопке "Оформить заказ" в интернет-магазине. Этот перехватчик использует довольно примитивную технику для обнаружения недействительного токена: он возвращает результат invalid.token, который может быть отображен в вашей конфигурации действий. Более сложная реализация, TokenSessionStoreInterceptor, может обеспечить гораздо лучшую логику для обнаружения недействительных токенов.

    Примечание: чтобы установить токен в вашей форме, вы должны использовать token tag, Этот тег является обязательным и должен использоваться в формах, которые подчиняются действиям, защищенным этим перехватчиком. Любой запрос, который не предоставляет токен (с использованием тега токена), будет обработан как запрос с недействительным токеном.

  • Перехватчик токеновой сессии

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

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

ВАЖНЫЙ!

Стоит отметить, что, как и в случае с Validation, решение на стороне сервера, подобное этому, должно быть обязательным, в то время как решение на стороне клиента, такое как отключение кнопки отправки только с помощью Javascript, недостаточно.
Что если пользователь повторно активирует кнопку с помощью Firebug? Что делать, если он / она подделывает запрос с помощью Javascript? Если я нахожусь на своем сайте Банка и пытаюсь отправить запрос дважды (например, денежным переводом), крайне важно, чтобы он обрабатывался только один раз.

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

Вы можете запретить пользователю двойной щелчок на клиентской стороне, как предлагает @Stefan, но если вы ищете способ предотвратить его из бэкэнда /mysql, проверьте ответ от

Вставить, где не существует - без первичного ключа

Другие вопросы по тегам