formフォームの重複コミットを防止



通常、fromフォームが重複してコミットされる場合は、次のようになります.
(1)提出ボタンを2回クリックする.
(2)リフレッシュボタンをクリックする.
(3)ブラウザ後退ボタンを使用して以前の操作を繰り返し、フォームを繰り返しコミットする.
(4)ブラウザ履歴を用いてフォームを繰り返しコミットする.
(5)ブラウザが繰り返すHTTPリクエスト.
 
 
問題の解決策:
1、js方式
1.1、最初のポイントコミット後にbuttonをdisableに設定します.
var button = document.getElementById("btn");//  button  
 
    button.attr("disabled","disabled");
 
    window.setTimeout(function(){
 
    $button.removeAttr("disabled");},1000);

1.2、初めて提出したかどうかを判断するためにフラグビットを設定する

var checkSubmitFlg = false; 
 
function checkSubmit() { 
 
    if (!checkSubmitFlg) { 
 
        checkSubmitFlg = true; 
 
        return true; 
 
        }
 
    else{ 
 
            alert("      "); 
 
            return false; 
 
        } 
 
} 
 

 
2.Post/Redirect/Getモードを使用する.
コミット後にページリダイレクトを実行します.これがいわゆるPost-Redirect-Get(PRG)モードです.簡単に言えば、ユーザーがフォームをコミットした後、クライアントのリダイレクトを実行し、コミット成功情報ページに移動します.
これにより、ユーザがF 5を押すことによる重複コミットが回避され、ブラウザフォームを押すことによる重複コミットの警告も発生せず、ブラウザを押すことによる前進と後退を押すことによる同様の問題も解消される.
 
3、sessionに特殊なマークを保存します.
フォームページが要求されると、特殊な文字フラグ列が生成され、sessionに存在し、フォームの非表示ドメインに配置されます.フォームデータの処理を受け入れる場合は、識別文字列が存在するかどうかを確認し、すぐにsessionから削除し、正常にデータを処理します.
フォームのコミットに有効なフラグ列がない場合は、フォームがコミットされていることを示し、今回のコミットは無視されます.
これにより、Webアプリケーションのより高度なXSRF保護が可能になります.
 
4、データベースに制約を追加する
データベースに一意の制約を追加するか、一意のインデックスを作成して、重複するデータが発生しないようにします.これは、データの重複コミットを防止する最も効果的な方法です.
クライアント・スクリプトの使用
クライアント・スクリプトといえば、JavaScriptを使用して通常の入力検証を行うことがよくあります.次の例では、フォームの重複コミットの問題を処理します.次のコードを参照してください.

ユーザーが[コミット](Submit)ボタンをクリックすると、このボタンはグレーで使用できない状態になります.
上記の例では、OnClickイベントを使用してユーザーのコミット状態を検出し、「コミット」ボタンをクリックすると、そのボタンが直ちに失効状態になり、ユーザーはボタンをクリックして再コミットできません.