phpページ重複防止コミット方法の概要

3557 ワード

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に存在し、フォームに書きます.フォームの提出時にフォームに従ってサービス側に提出し、サービス側はセッションによって保存されたtokenとtokenを比較し、等しい場合はseesionに保存されたtokenを破棄し、ページが二次提出された場合、セッションに保存された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;
        }
    }


上記の3つの方法をまとめましたが、1つ目は2つ目の方法と組み合わせて使うとより良い効果が得られると思います.第2の方法と第3の方法個人は第3の方法が優位点があると感じます.
2つ目と3つ目の方法はtokenをsessionに書くことであり、この方法の利点は記憶空間を節約することであるが、悪い点はsessionがページ全体のロードを完了してから書き込む必要があるため、ページ全体のロードが比較的遅い場合、ユーザーが何度もコミットをクリックすると、sessionがまだ書き込まれていないため、システムが初めて入力したと考えられる可能性がある.検証が機能しなくなります.幸いphp関数は牛迫の関数を提供した.   session_write_close()は、ページのロードが完了するのを待つことなく、すぐにセッションを書き込むことができます.同僚はsessionの格納にも多くの方法を選択することができ、redis、memcache、データベースが存在してもよい.