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 得到根目录的 __FILE__ 常量
Jul 23 PHP
php在线代理转向代码
May 05 PHP
php统计时间和内存使用情况示例分享
Mar 13 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
Nov 24 PHP
php检测url是否存在的方法
Apr 14 PHP
PHP验证信用卡卡号是否正确函数
May 27 PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 PHP
AES加解密在php接口请求过程中的应用示例
Oct 26 PHP
PHP实现限制IP访问的方法
Apr 20 PHP
php实现评论回复删除功能
May 23 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
php中使用array_filter()函数过滤数组实例讲解
Mar 03 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
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
使用eAccelerator加密PHP程序
2008/10/03 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
理解JavaScript中的事件
2006/09/23 Javascript
Mootools 1.2教程 滑动效果(Slide)
2009/09/15 Javascript
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
jQuery中的bind绑定事件与文本框改变事件的临时解决方法
2010/08/13 Javascript
js拦截alert对话框另类应用
2013/01/16 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
javascript匿名函数中的'return function()'作用
2018/10/15 Javascript
Seajs源码详解分析
2019/04/02 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
详细分析vue表单数据的绑定
2020/07/20 Javascript
python self,cls,decorator的理解
2009/07/13 Python
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
详解python metaclass(元类)
2020/08/13 Python
python链表类中获取元素实例方法
2021/02/23 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
HTML5: Web 标准最巨大的飞跃
2008/10/17 HTML / CSS
德国户外商店:eXXpozed
2020/07/25 全球购物
仓库管理制度
2014/01/21 职场文书
公司请假条范文
2014/04/11 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
人事任命通知
2015/04/20 职场文书
开国大典观后感
2015/06/04 职场文书
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS