ThinkPHP防止重复提交表单的方法实例分析


Posted in PHP onMay 10, 2018

本文实例总结分析了ThinkPHP防止重复提交表单的方法。分享给大家供大家参考,具体如下:

为什么会有表单重复的坑

在开发中,如果一个新增或修改的表单,在后台完成数据库操作后我们设定的不是跳转到其他页面,还是返回本页面,这时点击浏览器的后退再提交或刷新页面,会导致form表单重复提交,即这条记录会被增加或修改两次。

导致表单重复提交的原因是:第一次提交的表单会被缓存到内存中,直到页面下次提交或页面关闭或转向其他页面时才消失。在自调用返回时,内存中的数据依然在,这时页面中的判断提交的代码依然可以检测到提交的值,顾会产生重复提交的效果。

如何解决?

总结网上的解决办法和自己的测试,可以用以下几个办法:

方法1:最简单:页面提交后转到另一个页面而不是本页面,举个栗子,比如你的页面地址为

http://yourdomain.com/User/Index/login

则该页面的表单action地址可以为另外的处理地址,如

<form action="{:U('User/Index/check_login')}" method="post">

这样报错返回,或者用户点击回退按钮,还是会回到上一个地址,不过这种情况也不保险。还要搭配方法2,一起比较保险

方法2:提交表单后提交按钮变灰/隐藏提交按钮

这种方式一般是结合方法1来做的,通过JS来动态监听用户的点击动作,动态将按钮属性置成disabeld,即为灰色不可用。代码如下:

HTML:

<form action="{:U('User/Index/check_login')}" method="post">
  <input type="text" name="username" value="" id="username" />
  <input type="password" name="userpwd" id="userpwd" />
  <input type="submit" name="login_btn" id="login_btn" value="登陆"/>
</form>

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:

<input type="hidden" name="TOKEN" value="{:session('TOKEN')}" />

在页面展示前调用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语法不是盖的,整个排版都清爽了,不错不错。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
坏狼的PHP学习教程之第1天
Jun 15 PHP
PHP 用数组降低程序的时间复杂度
Dec 04 PHP
php异常处理技术,顶级异常处理器
Jun 13 PHP
基于PHP CURL获取邮箱地址的详解
Jun 03 PHP
php实现与erlang的二进制通讯实例解析
Jul 23 PHP
php实现MySQL数据库备份与还原类实例
Dec 09 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
Jan 08 PHP
基于thinkPHP实现的微信自定义分享功能示例
Sep 23 PHP
PHP简单留言本功能实现代码
Jun 09 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
Laravel 添加多语言提示信息的方法
Sep 29 PHP
PHP实现用户登录的案例代码
May 10 #PHP
yii2多图上传组件的使用教程
May 10 #PHP
PHP数组去重的更快实现方式分析
May 09 #PHP
PHP+MySQL实现消息队列的方法分析
May 09 #PHP
PHP共享内存使用与信号控制实例分析
May 09 #PHP
php curl批处理实现可控并发异步操作示例
May 09 #PHP
php使用curl伪造来源ip和refer的方法示例
May 08 #PHP
You might like
php+mysql写的简单留言本实例代码
2008/07/25 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
Laravel 登录后清空COOKIE的操作方法
2019/10/14 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
js动态创建表格,删除行列的小例子
2013/07/20 Javascript
node.js下when.js 的异步编程实践
2014/12/03 Javascript
JavaScript中的Math.LOG2E属性使用详解
2015/06/14 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
2019/06/10 Javascript
Vue基于iview table展示图片实现点击放大
2020/08/05 Javascript
jquery实现穿梭框功能
2021/01/19 jQuery
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
Python排序算法实例代码
2017/08/10 Python
速记Python布尔值
2017/11/09 Python
python字符串的方法与操作大全
2018/01/30 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
地图可视化神器kepler.gl python接口的使用方法
2020/12/22 Python
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
使用canvas绘制贝塞尔曲线
2014/12/17 HTML / CSS
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
结构和类有什么异同
2012/07/16 面试题
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
党务公开方案
2014/05/06 职场文书
爱与责任演讲稿
2014/05/20 职场文书
作风建设演讲稿
2014/05/23 职场文书
2015年农村党员干部主题教育活动总结
2015/03/25 职场文书
小型企业的绩效考核制度模板
2019/11/21 职场文书
mysql 索引合并的使用
2021/08/30 MySQL
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server