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 相关文章推荐
在apache下限制每个虚拟主机的并发数!!!!
Oct 09 PHP
PHP memcache扩展的三种安装方法
Apr 26 PHP
php自定义函数之递归删除文件及目录
Aug 08 PHP
解析mysql left( right ) join使用on与where筛选的差异
Jun 18 PHP
Yii Framework框架获取分类下面的所有子类方法
Jun 20 PHP
最常用的8款PHP调试工具
Jul 06 PHP
CodeIgniter中使用cookie的三种方式详解
Jul 18 PHP
浅谈php函数serialize()与unserialize()的使用方法
Aug 19 PHP
PHP中echo,print_r与var_dump区别分析
Sep 29 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
Jan 11 PHP
Zend Framework教程之模型Model基本规则和使用方法
Mar 04 PHP
php一个文件搞定微信jssdk配置
Dec 12 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学习教程之第2天
2008/06/15 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
jQuery移除元素自动解绑事件实现思路及代码
2014/05/31 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
微信小程序开发中的疑问解答汇总
2017/07/03 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
React中嵌套组件与被嵌套组件的通信过程
2018/07/11 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
2019/02/11 Javascript
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
Python连接MySQL并使用fetchall()方法过滤特殊字符
2016/03/13 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
Python中的集合介绍
2019/01/28 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
2020/05/03 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
NOTINO英国:在线购买美容和香水
2020/02/25 全球购物
港湾网络笔试题
2014/04/19 面试题
安踏广告词改编版
2014/03/21 职场文书
委托书范本
2014/04/02 职场文书
学雷锋树新风演讲稿
2014/05/10 职场文书
第二批党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
交通处罚决定书
2015/06/24 职场文书