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