防止表单重复提交

引言

表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如:
点击提交按钮两次。
点击刷新按钮。
使用浏览器后退按钮重复之前的操作,导致重复提交表单。

如何解决?

通过创建令牌,验证,销毁。来避免一个令牌,产出多次表单提交。

1.令牌函数

//创建TOKEN
function create_token() {
    $code = chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) . chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) . chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE));
    // 加密
    $token = md5("ADMIN" . substr(md5($code), 8, 10));

    session('TOKEN', $token);
}

//判断TOKEN
function check_token($token) {
    if ($token == session('TOKEN')) {
        session('TOKEN', NULL);
        return TRUE;
    } else {
        return FALSE;
    }
}

2.在页面出现前,创建令牌

// 创建令牌,防止表单重复提交
create_token();
return $this->fetch();

3.在表单中,加入令牌,并赋值

<input type="hidden" name="TOKEN" value="{:session('TOKEN')}">

4.提交表单后验证令牌

        if (request()->isPost()) {
            if (!check_token($_POST['TOKEN'])) {
                $this->redirect('LiveExtra/bannerList');
                return;
            }


            if (input('?post.id')) {
                // 编辑

                return "编辑";
            } else {
                // 添加

                return "添加";

            }

        }

小结

通过唯一的令牌机制,可以避免表单重复提交的问题。如果数据很重要的时候,可以这样处理。

posted @ 2017-10-12 17:12  随风行走  阅读(198)  评论(0编辑  收藏  举报