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初学者头痛的十四个问题
Jul 12 PHP
一个程序下载的管理程序(三)
Oct 09 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
Apr 12 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
Oct 31 PHP
用php实现百度网盘图片直链的代码分享
Nov 01 PHP
浅谈thinkphp的实例化模型
Jan 04 PHP
PHP实现数据分页显示的简单实例
May 26 PHP
php实现异步将远程链接上内容(图片或内容)写到本地的方法
Nov 30 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
Apr 19 PHP
PHP实现的curl批量请求操作示例
Jun 06 PHP
php中访问修饰符的知识点总结
Jan 27 PHP
PHP并发场景的三种解决方案代码实例
Feb 27 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&amp;mysql(五)
2006/10/09 PHP
php设计模式之单例模式使用示例
2014/01/20 PHP
php校验表单检测字段是否为空的方法
2015/03/20 PHP
win10环境PHP 7 安装配置【教程】
2016/05/09 PHP
laravel自定义分页效果
2017/07/23 PHP
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
electron实现qq快捷登录的方法示例
2018/10/22 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
基于VSCode调试网页JavaScript代码过程详解
2020/07/20 Javascript
python条件和循环的使用方法
2013/11/01 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
python实现用户管理系统
2018/01/10 Python
python 获取图片分辨率的方法
2019/01/08 Python
正确理解Python中if __name__ == '__main__'
2019/01/24 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
2019/02/08 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
python实现简单俄罗斯方块
2020/03/13 Python
SmartBuyGlasses中国:唯视良品(销售名牌太阳镜、墨镜和眼镜框)
2017/07/03 全球购物
Kneipp克奈圃美国官网:德国百年精油配方的传承
2018/02/07 全球购物
全球精选男装和家居用品:Article
2020/04/13 全球购物
企业行政文员岗位职责
2013/12/03 职场文书
工作自荐信
2013/12/11 职场文书
学校招生宣传广告词
2014/03/19 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2014年教育教学工作总结
2014/11/13 职场文书
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers