页面防重复提交方法总结

有时候我们的程序执行比较慢,而且我们页面也不怎么友好,没什么提示信息。操作人员以为没有点击提交按钮,就会再一次点击提交。这会导致很多问题出现。下面介绍三种防重复提交的方法。
 
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或者数据库都可以的。
 

时间: 2024-07-28 23:23:13

页面防重复提交方法总结的相关文章

php页面防重复提交方法总结_php技巧

1.提交按钮置disabled       当用户提交后,立即把按钮置为不可用状态.这种用js来实现.          提交前 复制代码 代码如下:         $("#submit").attr('disabled','true');         $("#submit").val("正在提交,请稍等");          ........................................................

php 防止表单重复提交方法

 用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题.我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交. 1.使用客户端脚本 [代码]xm l代码: 1<form method="post" name="register" action="test.php" enctype="multipart/form-data"> 2<in put

php通过记录IP来防止表单重复提交方法分析_php技巧

本文实例分析了php通过记录IP来防止表单重复提交方法.分享给大家供大家参考.具体分析如下: 这个原理比较的简单就是用户第一次提交时我们记录提交用户的IP地址,这样如果用户在固定时间内再次提交表单就会提示重复提交了,这种做法通常用于在顶一下,支持一下这种应用中了,在防止数据重复提交是一个非常不好的选择. 例子,代码如下: 复制代码 代码如下: <?php session_start(); if(empty($_SESSION['ip']))//第一次写入操作,判断是否记录了IP地址,以此知道是否

asp.net页面防止重复提交示例

 asp.net页面button按钮防止重复提交的方法,大家参考使用吧 先放javascript代码:   代码如下: <script type="text/javascript">         var clicks = 0;         function checkclick(obj) {             clicks = clicks + 1;             if (clicks>1) {                 alert(&q

防直接访问 防重复提交

防止直接访问PHP页面 1.可以在A加COOKIE,B判断COOKIE后用完删掉COOKIE 2. 使用$_SERVER['HTTP_REFERER'] 得到链接到当前页面的前一页面的地址 3.token令牌 Java代码   <?php   /*  * PHP简单利用token防止表单重复提交  * 此处理方法纯粹是为了给初学者参考  */   session_start();   function set_token()   {       $_SESSION['token'] = md5(

asp.net表单提交时防重复提交并执行前台的JS验证_实用技巧

在项目开发中,遇到这样的一个情况,就是用户重复提交.当然这个不能怪用户,只能怪.NET或者服务器反应迟钝......我是这样理解的. 在网上搜了一下,解决方案是不少,比如: http://bbs.csdn.net/topics/340048988 (这个大家提了不少建议) http://www.cnblogs.com/blsong/archive/2009/12/24/1631144.html (这个基本上总结了网上的方法) 但实际上做互联网web项目中,需要在前台执行JS或者Jquery的验证

Asp.net防重复提交机制实现方法_实用技巧

为Button或其他控件加上下面两个属性即可 1.UseSubmitBehavior="false"使用服务器端提交机制,即执行OnClick事件. 2.OnClientClick客户端点击按钮后,设置控件为不可用,控件文本显示处理中-,待服务器端执行完OnClick事件,控件自动恢复为可用. 代码如下: 复制代码 代码如下: UseSubmitBehavior="false" OnClientClick="this.disabled=true;this.

asp.net页面防止重复提交示例分享_实用技巧

先放javascript代码: 复制代码 代码如下: <script type="text/javascript">        var clicks = 0;        function checkclick(obj) {            clicks = clicks + 1;            if (clicks>1) {                alert("请勿重复点击!");                ret

javascript实现避免页面按钮重复提交_javascript技巧

复制代码 代码如下: function preventAjax(obj,num){             obj.disabled = true;             var num = num;             var types =obj.type;             if(types == 'submit'){                 var text = obj.value;                 var time1 = setInterval(fu