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 相关文章推荐
jq的get传参数在utf-8中乱码问题的解决php版
Jul 23 PHP
攻克CakePHP系列二 表单数据显示
Oct 22 PHP
PHP 金额数字转换成英文
May 06 PHP
使用VisualStudio开发php的图文设置方法
Aug 21 PHP
PHP explode()函数用法、切分字符串
Oct 03 PHP
php 问卷调查结果统计
Oct 08 PHP
PHP大神的十大优良习惯
Sep 14 PHP
PHP编程实现计算抽奖概率算法完整实例
Aug 09 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
Apr 20 PHP
PHP多个图片压缩成ZIP的方法
Aug 18 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
Oct 25 PHP
PHP+RabbitMQ实现消息队列的完整代码
Mar 20 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静态类
2006/11/25 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
jquery获取对象的方法足以应付常见的各种类型的对象
2014/05/14 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
实例详解JSON取值(key是中文或者数字)方式
2017/08/24 Javascript
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
解决Pycharm出现的部分快捷键无效问题
2018/10/22 Python
opencv实现图片模糊和锐化操作
2018/11/19 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
农村面貌改造提升实施方案
2014/03/18 职场文书
贺卡寄语大全
2014/04/11 职场文书
团队队名口号大全
2014/06/06 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
创先争优个人承诺书
2014/08/30 职场文书
民政局个人整改措施
2014/09/24 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
优秀护士事迹材料
2014/12/25 职场文书
学生检讨书范文
2015/01/27 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书
2015年民兵整组工作总结
2015/07/24 职场文书
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
浅谈Python响应式类库RxPy
2021/06/14 Python
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android