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