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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
Oct 09 PHP
用PHP生成html分页列表的代码
Mar 18 PHP
php图片加中文水印实现代码分享
Oct 31 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
双冒号 ::在PHP中的使用情况
Nov 05 PHP
Ajax和PHP正则表达式验证表单及验证码
Sep 24 PHP
PHP实现的一致性Hash算法详解【分布式算法】
Mar 31 PHP
Yii框架日志记录Logging操作示例
Jul 12 PHP
Yii框架常见缓存应用实例小结
Sep 09 PHP
解决laravel5.4下的group by报错的问题
Oct 16 PHP
PHP执行系统命令函数实例讲解
Mar 03 PHP
PHP读取文件或采集时解决中文乱码
Mar 09 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
关于PHP5 Session生命周期介绍
2010/03/02 PHP
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
PHPMailer邮件发送的实现代码
2013/05/04 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
2016/06/30 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
IE图片缓存document.execCommand(&quot;BackgroundImageCache&quot;,false,true)
2011/03/01 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
如何获取JQUERY AJAX返回的JSON结果集实现代码
2012/12/10 Javascript
JS常见问题整理(持续更新)
2013/08/06 Javascript
javascript正则表达式基础知识入门
2015/04/20 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
2016/02/18 Javascript
JavaScript类的写法
2016/09/17 Javascript
iview在vue-cli3如何按需加载的方法
2018/10/31 Javascript
node和vue实现商城用户地址模块
2018/12/05 Javascript
用Fundebug插件记录网络请求异常的方法
2019/02/21 Javascript
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
2020/05/29 Javascript
python实现删除文件与目录的方法
2014/11/10 Python
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
2016/12/18 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
Python-ElasticSearch搜索查询的讲解
2019/02/25 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
python 实现在shell窗口中编写print不向屏幕输出
2020/02/19 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
关于Python错误重试方法总结
2021/01/03 Python
新加坡第一大健康与美容零售商:屈臣氏新加坡(Watsons Singapore)
2020/12/11 全球购物
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
美工的岗位职责
2013/11/14 职场文书
爱护公共设施的标语
2014/06/24 职场文书
不错的求职信范文
2014/07/20 职场文书
党员个人整改措施
2014/10/24 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL