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 相关文章推荐
实用函数9
Nov 08 PHP
php入门学习知识点三 PHP上传
Jul 14 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
Jun 05 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
Jul 04 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
Aug 21 PHP
Yii框架关联查询with用法分析
Dec 02 PHP
php抽象类使用要点与注意事项分析
Feb 09 PHP
PHP实现阳历到农历转换的类实例
Mar 07 PHP
php简单获取目录列表的方法
Mar 24 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
Jun 13 PHP
phpstudy后门rce批量利用脚本的实现
Dec 12 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
Aug 24 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
《被神捡到的男人》动画化计划进行中!
2020/03/06 日漫
摘自织梦CMS中的图片处理类
2015/08/08 PHP
php实现阳历阴历互转的方法
2015/10/28 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
centos7上编译安装php7以php-fpm方式连接apache
2018/11/08 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
javascript中的array数组使用技巧
2010/01/31 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
javascript实现鼠标拖动改变层大小的方法
2015/04/30 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
jstl中判断list中是否包含某个值的简单方法
2016/10/14 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
vue-loader教程介绍
2017/06/14 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
元素全屏的设置与监听实例
2017/11/28 Javascript
详解create-react-app 自定义 eslint 配置
2018/06/07 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
vue中defineProperty和Proxy的区别详解
2020/11/30 Vue.js
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
详解重置Django migration的常见方式
2019/02/15 Python
pandas DataFrame索引行列的实现
2019/06/04 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
对Python生成器、装饰器、递归的使用详解
2019/07/19 Python
详解python中的数据类型和控制流
2019/08/08 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
设置器与访问器的定义以及各自特点
2016/01/08 面试题
医药专业推荐信
2013/11/15 职场文书
挂牌仪式主持词
2014/03/20 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
放飞梦想演讲稿800字
2014/08/26 职场文书
放飞梦想演讲稿200字
2014/08/26 职场文书
买房协议书范本
2014/10/23 职场文书
演讲开头怎么书写?
2019/08/06 职场文书