laravel 5.4解决表单重复提交

作者: 白云飞 分类: php 发布时间: 2017-05-25 09:22 阅读:

用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]);
    }
}

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。