应用场景:因为考虑系统安全以及数据准确性的问题,表单提交后应该拒绝重复提交。
分析:我们可以给页面做标记,进入表单创建页面时设置一个唯一标记值同时把这个标记值用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);}