ThinkPHP防止反复提交表单的办法实例剖析
本文实例总结剖析了ThinkPHP防止反复提交表单的办法。分享给大家供大家参考,详细如下:
为什么会有表单反复的坑
在开发中,如果一个新增或修改的表单,在后台完成数据库操纵后我们设定的不是跳转到其他页面,还是返回本页面,这时点击阅读器的后退再提交或刷新页面,会导致form表单反复提交,即这条记载会被增添或修改两次。
导致表单反复提交的缘由是:第一次提交的表单会被缓存到内存中,直到页面下次提交或页面关闭或转向其他页面时才消逝。在自调用返回时,内存中的数据仍然在,这时页面中的判断提交的代码仍然可以检测到提交的值,顾会发生反复提交的结果。
怎样解决?
总结网上的解决方法和本人的测试,可以用以下几个方法:
办法1:最简便:页面提交后转到另一个页面而不是本页面,举个栗子,比方你的页面地址为
http://www.baidow.com/tupian/lupian/20190520/wkrkw2aejmc.com
则该页面的表单action地址可认为另外的处置地址,如
JS:
$().ready(function(){ $("#login_btn").on('click',function(){ $(this).attr('disabled',true); }); });
办法1+办法2 结合后,根本上90%以上的反复提交问题都能解决,但是大刘这里还是要说下第三种办法,即在效劳端一劳永逸的解决这个问题
办法3:使用潜藏随机TOKEN值的办法停止反复提交判断
首先,在项目的functions.php中增加如下办法
//创立TOKEN function createToken() { $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)); session('TOKEN', authcode($code)); } //判断TOKEN function checkToken($token) { if ($token == session('TOKEN')) { session('TOKEN', NULL); return TRUE; } else { return FALSE; } } /* 加密TOKEN */ function authcode($str) { $key = "YOURKEY"; $str = substr(md5($str), 8, 10); return md5($key . $str); }
在表单页面form中填入以下HTML代码
HTML:
在页面展现前调用creatToken()
办法生成token,在响应控制器POST恳求中 使用 checkToken()
停止判断是否反复提交
if(IS_POST) { $post_token = I('post.TOKEN'); if(!checkToken($post_token)){ $this->error('请不要反复提交页面',U('User/Index/login')); } }
根本上,这3个办法配合着使用,就能解决ThinkPHP开发中表单反复提交问题,当然,有同学说可以使用ThinkPHP的令牌环机制,这样其实就更简便了,TP会默许在表单中生成一个潜藏域,到时候判断这个潜藏域是否存在以及和session中的值是否想的即可,道理和办法3是一样的。
PS:今天终于把内容用简书的markdown编辑器发出来了,公然markdown语法不是盖的,整个排版都清新了,不错不错。