php页面防重复提交方法总结


Posted in PHP onNovember 25, 2013

1、提交按钮置disabled

      当用户提交后,立即把按钮置为不可用状态。这种用js来实现。

         提交前

        $("#submit").attr('disabled','true');
         $("#submit").val("正在提交,请稍等");

 

       ....................................................................................

    执行后,把按钮置为原来状态

      $('#submit ').removeAttr('disabled');
      $("#submit ").val("确定提交");

2、过期时间法

    思路:当用户提交按钮后生成一个token(每次业务提交token 为唯一值)存入session,并设置过期时间。当用户再此提交时,检测token是否一致且是否过期,若一致且没有过期,则认为提交了二次。当程序执行出错的时候,则需要清除存入session的值。见下面程序

function checkRepeatSubmit($uniqueid = '', $expire = 30) {
        $uniqueid = empty($uniqueid) ? Yii::app()->user->id . Yii::app()->user->name . Yii::app()->user->mihome : $uniqueid;
        $token = md5("wms_check_repeat" . $uniqueid);
        $time = time();
        if (isset($_SESSION['token']) && !empty($_SESSION['token']) && $_SESSION['token'] == $token && ($time - $_SESSION['expire_time'] < $expire)) {
            return false;
        } else {
            $_SESSION['token'] = $token;
            $_SESSION['expire_time'] = $time;
            //session写入的时候会等待整个页面加载完成,用此函数可以立即写入
            session_write_close();
            return true;
        }
    }
 //删除存入的值
   function cancelRepeatSubmit() {
        unset($_SESSION['token']);
        unset($_SESSION['expire_time']);
    }

3、token销毁法

思路:当页面进行加装的时候生成token,存在session中,并写在表单里。表单提交的时候随表单提交给服务端,服务端通过session存入的token与token进行比较,若相等,则销毁seesion中存入的token,当页面遭到二次提交的时候,由于存入session中的token不存在而报错。下面是代码

 /**
     * 第二种方案
     * 1、产生token,并存在session中
     * 2、随页面生成
     * 3、提交页面与session进行比对,成功后对session进行销毁
     * 4、第二次提交则不存在这个值而报错
     * @param type $uniqueid
     * @return type
     */
    function createToken($uniqueid) {
        $uniqueid = empty($uniqueid) ? Yii::app()->user->id . Yii::app()->user->name . Yii::app()->user->mihome : $uniqueid;
        $token = md5("wms_check2_repeat" . $uniqueid);
        $_SESSION['form_token'] = $token;
       ​session_write_close();

        return $token;
    }
    function checkToken($token) {
        if (!isset($_SESSION['form_token']) || empty($_SESSION['form_token']) || $_SESSION['form_token'] != $token) {
            return false;
        } else {
            unset($_SESSION['form_token']);
            return true;
        }
    }

上面总结了三种方法,个人感觉第一种跟第二种方法配合着用会达到更好的效果。第二种方法与第三种方法个人感觉第三种要有优势点。

第二种与第三种方法都是把token写在session中,这种方法好处是节省存储空间,但坏处是由于session是需要整个页面加载完毕才能写入,故当整个页面加载比较慢,且用户点击多次提交,可能由于session还没写入导致系统还认为是第一次输入。导致验证不起作用。好在php函数提供了一个牛逼的函数。   session_write_close(),可以立即把session写入,不用等待页面加载完成。同事对于session的存入也有很多种方法可以选择,可以存在redis,memcache或者数据库都可以的。

PHP 相关文章推荐
php 无限级 SelectTree 类
May 19 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
Dec 08 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
Mar 27 PHP
PHP读取文件并可支持远程文件的代码分享
Oct 03 PHP
深入解析phpCB批量转换的代码示例
Jun 27 PHP
PHP生成自适应大小的缩略图类及使用方法分享
May 06 PHP
php实现的日历程序
Jun 18 PHP
ubuntu下配置nginx+php+mysql详解
Sep 10 PHP
php单元测试phpunit入门实例教程
Nov 17 PHP
PHP有序表查找之插值查找算法示例
Feb 10 PHP
PHP的mysqli_sqlstate()函数讲解
Jan 23 PHP
详解将数据从Laravel传送到vue的四种方式
Oct 16 PHP
php用header函数实现301跳转代码实例
Nov 25 #PHP
保存到桌面、设为桌面且带图标的PHP代码
Nov 19 #PHP
php使浏览器直接下载pdf文件的方法
Nov 15 #PHP
限制ckeditor上传图片文件大小的方法
Nov 15 #PHP
php ckeditor上传图片文件名乱码解决方法
Nov 15 #PHP
json的键名为数字时的调用方式(示例代码)
Nov 15 #PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
Nov 14 #PHP
You might like
PHP完整的日历类(CLASS)
2006/11/27 PHP
单台服务器的PHP进程之间实现共享内存的方法
2014/06/13 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
javascript开发技术大全 第4章 直接量与字符集
2011/07/03 Javascript
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
浅谈JavaScript数据类型
2015/03/03 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
2019/10/21 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
对numpy中轴与维度的理解
2018/04/18 Python
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
Pytorch之parameters的使用
2019/12/31 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
土木工程毕业生自荐信
2013/11/12 职场文书
2014的自我评价
2014/01/13 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
债务纠纷委托书范本
2014/10/14 职场文书
2014年作风建设剖析材料
2014/10/23 职场文书
大学生学期个人总结
2015/02/12 职场文书
2015年骨干教师工作总结
2015/05/26 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android