FORM表单防止页面重复提交

应用场景:因为考虑系统安全以及数据准确性的问题,表单提交后应该拒绝重复提交。

分析:我们可以给页面做标记,进入表单创建页面时设置一个唯一标记值同时把这个标记值用SESSION保存起来,用户点击提交按钮时,把该标记值同时提交到后台,后台识别到该唯一标记值后,废弃该标记值,如果下次再提交该表单就会提交失败。

拓展应用:设置表单提交过期提示。

1、创建表单:设置令牌并设置到FORM表单中,随表单一起提交。

/**
 * 设置一个FORM表单提交令牌
 */
public function setFormToken()
{
    $form_tokens                = session('_form_tokens');
    if(!is_array($form_tokens)) $form_tokens = array();

    $form_token                 = md5(time().uniqid().rand(0, 99999999));
    $form_tokens[$form_token]   = 1; // 标记该令牌已经使用

    session('_form_tokens', $form_tokens); // session存储令牌
    $this->assign('_form_token', $form_token); // 设置到模板文件中
}

2、界面显示

<form action="" method="POST">
    <input type="hidden" name="_form_token" value="{$_form_token}" />
</form>


3、表单提交后令牌判断以及废弃,防止重复提交

/**
 * 判断表单是否重复提交
 */
public function checkFormToken()
{
    $form_tokens    = session('_form_tokens'); // 读取session中保存的令牌
    $form_token     = I('request._form_token', '', 'trim'); // 模板文件中提交设置的令牌
    if(!$form_token || !is_array($form_tokens) || !isset($form_tokens[$form_token]))
        $this->error('请勿重复提交表单!'); // 第一次提交可以通过,第二次提交时因为令牌已经废弃而无法提交

    unset($form_tokens[$form_token]); // 提交一次后就把令牌废弃,防止重复提交
    session('_form_tokens', $form_tokens);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值