百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> ThinkPHP防止反复提交表单的办法实例剖析
分享文章到:

ThinkPHP防止反复提交表单的办法实例剖析

发布时间:05/20 来源:未知 浏览: 关键词:

本文实例总结剖析了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语法不是盖的,整个排版都清新了,不错不错。

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有161人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板