表单重复提交是在多用户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 "添加"; } } 小结通过唯一的令牌机制,可以避免表单重复提交的问题。如果数据很重要的时候,可以这样处理。