jasonOk
@jasonOk
Легче болтать, чем код писать

Как предотовратить одинаковые запросы от пользователя?

Суть вопроса: пользователь может создавать статьи, и, после заполнения нужных полей форма с помощью AJAX отправляется на сервер, но проблема в том, что эту форму можно отправить несколько раз подряд и может получиться множество одинаковых записей. Как с этим бороться?

success: function (data) {
 data = JSON.parse(data);
if (data['status'] == 'success') {
  window.location.href = data['href'];
}

Элементарно отредактировав JavaScript-перенаправление можно заново отправить форму.
  • Вопрос задан
  • 283 просмотра
Пригласить эксперта
Ответы на вопрос 3
@forevist
Front-End Developer
Отправка происходит при нажатии на кнопку?
Если да, то ставить флаг, и снимать его при ответе от сервера.

а про перенаправление не очень понял
Ответ написан
@dimbo
Обычно, если форма отправляется по нажатию кнопки, эта кнопку нужно сразу после нажатия перевести в состояние disabled (в обработчике onClick). Тогда нажать кнопку несколько раз подряд просто не получится.

Но, на сколько я понял, вы боитесь, что пользователь отредактирует JS в браузере и отправит данные заново с помощью измененного JS. Если это так, то нужно сказать, что любой POST-запрос можно таким образом продублировать - для этого даже не обязательно редактировать JS, можно использовать утилиты типа curl или wget, либо некоторые расширения браузера. Я бы рекомендовал не беспокоиться по этому поводу.

Но если вы все же хотите застраховаться от этого - генерируйте на сервере особый одноразовый ключ при генерации страницы с формой и включайте его в форму в виде hidden поля. (При использовании фреймворка PHP Laravel для этого можно воспользоваться функцией str_random()) Сохраняйте этот ключ в данных сессии и затем, при получении данных формы, проверяйте: если пришедший с данными формы ключ существует в данных сессии, то продолжить обработку и затем удалить ключ; если же пришедший с формой ключ в данных сессии отсутствует, то возвращайте ошибку 403 Bad request.
Ответ написан
Комментировать
@mik222
Вот вам гарантированное решение свободное от curl и прочих wget.
  1. Делаете хеш от формы/пользователя/timestamp (При этом timestamp может быть вида YYYY-MM-DD (т.е. форму можно повторно отправлять через сутки)
  2. Хеш храните в блюм фильтре(чтобы не занимать много места)
  3. Профит
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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