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输出控制功能在简繁体转换中的应用
Oct 09 PHP
php GD绘制24小时柱状图
Jun 28 PHP
PHP CKEditor 上传图片实现代码
Nov 06 PHP
通俗易懂的php防注入代码
Apr 07 PHP
php上传文件的增强函数
Jul 21 PHP
php的debug相关函数用法示例
Jul 11 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
PHP有序表查找之插值查找算法示例
Feb 10 PHP
php中如何执行linux命令详解
Nov 06 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
Oct 08 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 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/04 冲泡冲煮
PHP面向对象概念
2011/11/06 PHP
php语言流程控制中的主动与被动
2012/11/05 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
PHP的PDO错误与错误处理
2019/01/27 PHP
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
详解js闭包
2014/09/02 Javascript
nodejs爬虫抓取数据乱码问题总结
2015/07/03 NodeJs
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
JavaScript事件处理的方式(三种)
2016/04/26 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
nodejs和php实现图片访问实时处理
2017/01/05 NodeJs
BootStrap select2 动态改变值的方法
2017/02/10 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
JS实现简单的抽奖转盘效果示例
2019/02/16 Javascript
vue项目打包上传github并制作预览链接(pages)
2019/04/19 Javascript
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
Python 装饰器实现DRY(不重复代码)原则
2018/03/05 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
python中format函数如何使用
2020/06/22 Python
Python如何截图保存的三种方法(小结)
2020/09/01 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
蓝颜请假条
2014/04/11 职场文书
2014年党员承诺书范文
2014/05/20 职场文书
欠款起诉书范文
2015/05/19 职场文书
springboot实现string转json json里面带数组
2022/06/16 Java/Android