Отправка нескольких форм Laravel/PHP (многократное нажатие на кнопку отправки)

У меня есть некоторые проблемы из-за отправки нескольких форм. Я использую laravel в качестве фреймворка и создаю браузерную игру (я знаю, что их миллионы) просто для удовольствия.

У меня есть страница для зданий с кнопкой «Построить», которая находится в форме (method="post").

Если я удерживаю Enter в течение 4-5 секунд, будет запущено много запросов, и пользователь сможет создать много записей в базе данных.

Мне не нужно исправление только на стороне клиента, например

$(document).on('submit', 'form', function() {
    $(this).find('button:submit, input:submit').attr('disabled', 'disabled);
});

Потому что никогда не доверяйте клиенту.

Есть ли у кого-нибудь решение (может быть, с laravel)?

Заранее спасибо.

С наилучшими пожеланиями.


person viko91    schedule 23.03.2018    source источник
comment
Создайте случайный токен. Поместите токен в сеанс. Поместите токен в форму как скрытое поле. При отправке, если полученный токен равен полученному в сеансе, выполните все действия в базе данных и удалите токен из сеанса.   -  person assistbss    schedule 23.03.2018
comment
Итак, я всегда генерирую токен формы и сохраняю его в сеансе. И в каждой форме есть скрытое поле ввода с включенным токеном, верно?   -  person viko91    schedule 24.03.2018
comment
Использование промежуточного ПО для группы маршрутов (laravel.com/docs/5.6/routing#route- group-middleware), вы можете View::share (laravel.com/docs/5.6/views#sharing-data-with-all-views) случайный токен и сохранить сеанс.   -  person assistbss    schedule 26.03.2018
comment
Спасибо. Я попробую это.   -  person viko91    schedule 27.03.2018


Ответы (2)


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

public function construct(Request $request){
     $token = $request->_token;
     //check weather the token already exists or not, using db or session
     if(exists){
         return;
     }
}
person NIKHIL NEDIYODATH    schedule 23.03.2018
comment
Существует проблема. CSRF-токен будет создаваться для каждой сессии, а не для каждого запроса. Ваш пример возможен только в том случае, если я генерирую случайный токен в сеансе и отправляю почтовый запрос в качестве скрытого ввода, как упоминалось @assistbss. Или у вас есть другой подход, возможно, специфичный для Laravel? Спасибо. - person viko91; 24.03.2018

«Создайте случайный токен. Поместите токен в сеанс. Поместите токен в форму как скрытое поле. При отправке, если полученный токен равен полученному в сеансе, выполните все действия в базе данных и удалите токен из сеанса».

«Используя промежуточное ПО для группы маршрутов (laravel.com/docs/5.6/routing#route-group-middleware), вы можете View::share (laravel.com/docs/5.6/views#sharing-data-with-all-views) случайный токен и сохранить сеанс».

Спасибо @assistbss

person viko91    schedule 27.03.2018