laravel 5.4解决表单重复提交
用laravel 不是很久,也不知道官方有没有提供解决表单重复提交的问题。反正我在手册上是没有看到的。于是,打算自己写一下,没有做封装,只是一点思路,当然你可以顺着这个思路去完善它,让它更好用。
一次做form表单的 post 提交后,按着F5刷新页面,此时浏览器会提示
如果我们点击继续的话,此时表单会再次提交到后台,我们不做任何的防护措施的话,这条数据会再一次插入数据库。
我的解决办法就是,在渲染页面的时候,随机成功一个token埋在页面中,并把这个token放在session中,当收到表单提交来的token时,检测这个token在session中吗,如果在,那么视为第一次提交,提交之后立马删除这个session。下面如果重复提交的话,检测不到这个session就不做数据库插入操作了。好了,废话少说了,我们开始吧。
index.blade.php
<!doctype html>
<html>
<head>
<title>用户注册</title>
<meta charset="utf-8"/>
</head>
<body>
<form method="POST" action="{{ route('index') }}">
{{ csrf_field() }}
<input type="hidden" name="token" value="{{ $token }}" />
用户名 : <input name="name" type="text"/><br/>
<input type="submit" value="注册"/>
</form>
</body>
</html>
对应的控制器 indexController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class IndexController extends Controller
{
public function index(Request $request)
{
print_r($request->session()->all());
if($request->isMethod('post')){
$token = $request->input('token');
if(empty($request->session()->get($token))) {
return response('请勿重复提交', 403);
}
DB::table('users')->insert(['name' => $request->input('name')]);
$request->session()->pull($token, null);
return response('注册成功', 200);
}
$token = md5(time());
$request->session()->put($token, 1);
return view('index.index', ['token' => $token]);
}
}