У меня есть форма Добавление альбома в базу данных
{!! 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.