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中用文本文件做数据库的实现方法
Mar 27 PHP
PHP防注入安全代码
Apr 09 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 PHP
phpQuery占用内存过多的处理方法
Nov 13 PHP
PHP页面实现定时跳转的方法
Oct 31 PHP
php动态变量定义及使用
Jun 10 PHP
PHP实现的简单网络硬盘
Jul 29 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
Nov 10 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
Jan 07 PHP
PHP实现的分页类定义与用法示例
Jul 05 PHP
PHP Post获取不到非表单数据的问题解决办法
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
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
提高代码性能技巧谈—以创建千行表格为例
2006/07/01 Javascript
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
jquery 查找select ,并触发事件的实现代码
2011/03/30 Javascript
关于 文本框默认值 的操作js代码
2012/01/12 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
js实现交通灯效果
2017/01/13 Javascript
jQuery获取table表中的td标签(实例讲解)
2017/07/28 jQuery
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
微信小程序登录换取token的教程
2018/05/31 Javascript
element-ui 关于获取select 的label值方法
2018/08/24 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
[01:44]Ti10举办地公布
2019/08/25 DOTA
[46:20]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第二场 1月22日
2021/03/11 DOTA
使用python Django做网页
2013/11/04 Python
Python深入06——python的内存管理详解
2016/12/07 Python
Python内置模块turtle绘图详解
2017/12/09 Python
python2.6.6如何升级到python2.7.14
2018/04/08 Python
国际知名设计师时装商店:Coggles
2016/09/05 全球购物
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
客户代表自我评价范例
2013/09/24 职场文书
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
环境工程专业个人求职信
2013/12/05 职场文书
班主任工作年限证明
2014/01/12 职场文书
岗位说明书标准范本
2014/07/30 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
工程部岗位职责
2015/02/10 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
暑期社会实践新闻稿
2015/07/17 职场文书
争做文明公民倡议书
2019/06/24 职场文书
python 实现定时任务的四种方式
2021/04/01 Python
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS