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的魔术方法__get()和__set()使用介绍
Sep 19 PHP
PHP中对缓冲区的控制实现代码
Sep 29 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
Oct 16 PHP
php中simplexml_load_file函数用法实例
Nov 12 PHP
php支付宝接口用法分析
Jan 04 PHP
php中Socket创建与监听实现方法
Jan 05 PHP
php实现redis数据库指定库号迁移的方法
Jan 14 PHP
php 解决扫描二维码下载跳转问题
Jan 13 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
2017年最好用的9个php开发工具推荐(超好用)
Oct 23 PHP
PHP性能测试工具xhprof安装与使用方法详解
Apr 29 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 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
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
2007/03/15 PHP
请php正则走开
2008/03/15 PHP
PHP测试程序运行时间的类
2012/02/05 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
2013/06/27 PHP
PHP实现懒加载的方法
2015/03/07 PHP
php分页查询的简单实现代码
2017/03/14 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
原生JS实现图片翻书效果
2017/02/16 Javascript
jquery事件与绑定事件
2017/03/16 Javascript
JavaScript 巧学巧用
2017/05/23 Javascript
Nodejs调用WebService的示例代码
2017/09/29 NodeJs
jQuery实现的简单对话框拖动功能示例
2018/06/05 jQuery
js prototype和__proto__的关系是什么
2019/08/23 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
Python实现Const详解
2015/01/27 Python
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
Python json读写方式和字典相互转化
2020/04/18 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
Python性能测试工具Locust安装及使用
2020/12/01 Python
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
MAC Cosmetics巴西官方网站:M·A·C彩妆
2019/04/18 全球购物
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
汽车检测与维修个人求职信
2013/09/24 职场文书
上党课的心得体会
2014/09/02 职场文书
领导干部查摆“四风”问题自我剖析材料思想汇报
2014/10/05 职场文书
初中思品教学反思
2016/02/20 职场文书