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下对字符串的递增运算代码
Aug 21 PHP
解析Extjs与php数据交互(增删查改)
Jun 25 PHP
php中substr()函数参数说明及用法实例
Nov 15 PHP
php强制运行广告的方法
Dec 01 PHP
PHP简单实现无限级分类的方法
May 13 PHP
php生成与读取excel文件
Oct 14 PHP
PHP实现简单ajax Loading加载功能示例
Dec 28 PHP
php获取文章内容第一张图片的方法示例
Jul 03 PHP
Laravel中为什么不使用blpop取队列详析
Aug 01 PHP
php的扩展写法总结
May 14 PHP
PHP进阶学习之命名空间基本用法分析
Jun 18 PHP
PHPstorm启用自动换行的方法详解(IDE)
Sep 17 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 数组排序方法总结 推荐收藏
2010/06/30 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
2016/02/26 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
jQuery 标题的自动翻转实现代码
2009/10/14 Javascript
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
jQuery 点击图片跳转上一张或下一张功能的实现代码
2010/03/12 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
2013/10/25 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
vue制作加载更多功能的正确打开方式
2016/10/12 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
layui关闭层级、简单监听的实例
2019/09/06 Javascript
浅谈vue的第一个commit分析
2020/06/08 Javascript
Ant Design的可编辑Tree的实现操作
2020/10/31 Javascript
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
python分析作业提交情况
2017/11/22 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
python如何将两个txt文件内容合并
2019/10/18 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
python调用百度AI接口实现人流量统计
2021/02/03 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
基于html5 DeviceOrientation 实现微信摇一摇功能
2015/09/25 HTML / CSS
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
大四自我鉴定范文
2013/10/06 职场文书
求职简历自我评价范例
2014/03/12 职场文书
卫生院艾滋病宣传活动小结
2014/07/09 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
经典祝酒词大全
2015/08/12 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
Java实现多线程聊天室
2021/06/26 Java/Android