Laravel предотвращает повторную отправку формы - PullRequest
0 голосов
/ 24 октября 2018

У меня есть форма Добавление альбома в базу данных

 {!! Form::open(['method' => 'POST', 'route' => ['admin.album.store'], 'enctype' => 'multipart/form-data', 'id' => 'CreateAlbumForm']) !!}
<input type="hidden" name="_token" value="{{ csrf_token() }}">

// other fields

{!! Form::submit(trans('global.app_save'), ['class' => 'btn btn-danger']) !!}
{!! Form::close() !!}

Работает отлично.

Мне нужно, чтобы пользователь не нажимал кнопку «Отправить» несколько раз.который я знаю, возможно с jquery (отключение кнопки отправки при нажатии) .

Но я хочу сделать это, используя csrf защита (на стороне сервера), когда у пользователя не включен JavaScript .

После долгих поисков я нашел следующее решение:

Что я пробовал

Добавление функции ниже в VerifyCsrfToken.php

protected function tokensMatch($request)
{
    $token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');

    if (!$token && $header = $request->header('X-XSRF-TOKEN')) {
        $token = $this->encrypter->decrypt($header);
    }

    $tokensMatch = ($request->session()->token() == $token) ? TRUE : FALSE;

    if($tokensMatch) $request->session()->regenerateToken();

    return $tokensMatch;
}

И добавление _token внутри $dontFlash массива в файл app\Http\Requests\FormRequest.php

protected $dontFlash = ['password', 'password_confirmation', '_token'];

Это дает мне ошибку несоответствия токена Но когда я нажимаю на кнопку отправки более 2 раз.И запись вставляется 2 раза, что является нежелательным поведением.

Это должно дать мне ошибку при 2-й попытке отправки одновременно.

Короче, что мне нужно, если пользователь нажимает на кнопку отправкиКнопка один раз должна вставить запись.и если он нажимает на кнопку «Отправить» более одного раза, это должно привести к ошибке TokenMismatch.

1 Ответ

0 голосов
/ 24 октября 2018

You could set a token when you serve the form and check that against the database. When you submit the form, the token is checked and you can't submit it any more. Of course, it is still a good idea to do it front-end too as it is more visual for the user.

https://laracasts.com/discuss/channels/laravel/stopping-multiple-form-submission

Просто искал соответствующий ответ и нашел это.Надеюсь, это поможет.

...