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实现多服务器session共享之NFS共享的方法
Mar 16 PHP
PHP中的integer类型使用分析
Jul 27 PHP
file_get_contents获取不到网页内容的解决方法
Mar 07 PHP
深入分析php中接口与抽象类的区别
Jun 08 PHP
php通过array_shift()函数移除数组第一个元素的方法
Mar 18 PHP
微信access_token的获取开发示例
Apr 16 PHP
PHP实现适用于自定义的验证码类
Jun 15 PHP
PHP读取文件的常见几种方法
Nov 03 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
Oct 17 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
Oct 18 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的变量类型和作用域详解
2014/03/12 PHP
php过滤敏感词的示例
2014/03/31 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
php实现简单四则运算器
2020/11/29 PHP
PHP isset empty函数相关面试题及解析
2020/12/11 PHP
ASP SQL防注入的方法
2008/12/25 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
jQuery 通过事件委派一次绑定多种事件,以减少事件冗余
2010/06/30 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
S2SH整合JQuery+Ajax实现登录验证功能实现代码
2013/01/30 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
2014/02/11 Javascript
JQuery为元素添加样式的实现方法
2016/07/20 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
监控微信小程序中的慢HTTP请求过程详解
2019/07/05 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
Python更新数据库脚本两种方法及对比介绍
2017/07/27 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
Python跑循环时内存泄露的解决方法
2020/01/13 Python
pytorch构建多模型实例
2020/01/15 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
大学军训感言
2014/01/10 职场文书
护士自我介绍信
2014/01/13 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技