我有一种在数据库中添加相册的形式
{!! 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(在点击时禁用提交按钮)。
但是我想在用户未启用JavaScript的情况下使用 csrf
保护(服务器端)来实现。
经过大量搜索,我发现以下解决方案:
我尝试过的事情
在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
的{{1}}数组中添加$dontFlash
app\Http\Requests\FormRequest.php
它给我令牌不匹配错误,但是当我单击提交按钮超过2次时。并将记录插入2次,这是不必要的行为。
第二次尝试同时提交时应该给我错误。
所以简而言之,我需要的是,如果用户单次单击“提交”按钮,则应该插入记录。并且如果他单击提交的次数超过一次,则应给出TokenMismatch错误。
答案 0 :(得分:1)
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
只需搜索相关答案并找到答案。希望它会有所帮助。