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 09 PHP
队列在编程中的实际应用(php)
Sep 04 PHP
zend framework框架中url大小写问题解决方法
Aug 19 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
Nov 06 PHP
php实现统计网站在线人数的方法
May 12 PHP
PHP使用SOAP扩展实现WebService的方法
Apr 01 PHP
PHP简单读取PDF页数的实现方法
Jul 21 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
可兼容php5与php7的cURL文件上传功能实例分析
May 11 PHP
layui数据表格自定义每页条数limit设置
Oct 26 PHP
PHP autoload使用方法及步骤详解
Sep 05 PHP
PHP中SESSION过期设置
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
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
用PHP实现文件上传二法
2006/10/09 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
php常用图片处理类
2016/03/16 PHP
php导出csv文件,可导出前导0实例代码
2016/11/16 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
用Greasemonkey 脚本收藏网站会员信息到本地
2009/10/26 Javascript
js实现倒计时时钟的示例代码
2013/12/17 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
js判断手机号是否正确并返回的实现代码
2017/01/17 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
vue中SPA单页面应用程序详解
2017/11/07 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
Vue 数据绑定的原理分析
2020/11/16 Javascript
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
Django实战之用户认证(初始配置)
2018/07/16 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
python 8种必备的gui库
2020/08/27 Python
python Cartopy的基础使用详解
2020/11/01 Python
python中yield的用法详解
2021/01/13 Python
浅析HTML5的WebSocket与服务器推送事件
2016/02/19 HTML / CSS
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
实习生自我评价
2014/01/18 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers