php+ajax защита от F5

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Аватара пользователя
Introvert
Сообщения: 139
Зарегистрирован: 2017.07.04, 13:42
Откуда: Украина, Киев

php+ajax защита от F5

Сообщение Introvert »

Сделал на bootstrap 4+php7+ajax скрипт отправки сообщения на почту, использую jGrowl для всплывающего окна "Успешно отправлено!". При повторном нажатии можно заспамить весь ящик. Как избавиться от F5? В большинстве делают редирект, на jquery добавил строку location.reload(); но при этом сообщение об успехе не успевает увидеть пользователь. Как записать сообщения в сессию например на jQuery и достать его при отправке один раз?
Пишу социальную сеть заявок для фирм.
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: php+ajax защита от F5

Сообщение SiZE »

F5 и аякс как связаны?

По F5 https://en.wikipedia.org/wiki/Post/Redirect/Get

Самое простое сгенерировать токен для формы. Сохраняй его в сессию, если токены из формы и сессии совпадут, соответствено не давай повторную отправку делать, делай обновление страницы или еще что то.
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: php+ajax защита от F5

Сообщение BalykhinAS »

Introvert писал(а): 2018.03.01, 22:30 Сделал на bootstrap 4+php7+ajax скрипт отправки сообщения на почту, использую jGrowl для всплывающего окна "Успешно отправлено!". При повторном нажатии можно заспамить весь ящик. Как избавиться от F5? В большинстве делают редирект, на jquery добавил строку location.reload(); но при этом сообщение об успехе не успевает увидеть пользователь. Как записать сообщения в сессию например на jQuery и достать его при отправке один раз?
как минимум после первого нажатия можно деактивировать кнопку - при успехе очищаем форму и активируем кнопку, если ошибка активируем кнопку

как писали выше в контроллере в сессию вписываем рандомное значение
$session->set('f5', rand(10000, 99999));
в форме добавляем скрытое поле f5 и отправляем его вместе со всеми полями обработчику формы
if($session->get('f5') !== Yii::$app->request->post('f5')) {
return false;
}
можно вернуть массив с результатом и обновить значение f5
if($session->get('f5') !== Yii::$app->request->post('f5')) {
$session->set('f5', rand(10000, 99999));
return ['result' => 'error', 'f5' => rand(10000, 99999)]
}
если делать редирект то на стороне обработчика формы можно добавить флеш сообщение о результате, по идее оно отобразится на странице
Ответить