フォームの重複送信は、マルチユーザー Web アプリケーションで最も一般的な問題であり、多くの問題を引き起こします。次のような、重複送信の問題が発生するアプリケーション シナリオが多数あります。
送信ボタンを 2 回クリックします。 更新ボタンをクリックします。 ブラウザーの「戻る」ボタンを使用して前の操作を繰り返すと、フォームが繰り返し送信されます。 ブラウザの履歴を使用してフォームを繰り返し送信します。 ブラウザからの HTTP リクエストが重複します。
フォームの繰り返し送信を防ぐいくつかの方法
1. 送信ボタン を無効にします。 JavaScript を使用して、フォームの送信後に送信ボタンを無効にします。このアプローチにより、せっかちなユーザーがボタンを複数回クリックすることがなくなります。ただし、クライアントが Javascript を無効にしている場合、このメソッドは無効になります。
前回の記事で、いくつかの Jquery プラグインを使用するとうまく機能すると言いました。
2.投稿/リダイレクト/取得モード。送信後にページ リダイレクトを実行することは、いわゆる Post-Redirect-Get (PRG) パターンです。つまり、ユーザーがフォームを送信すると、クライアント側のリダイレクトが実行され、送信成功情報ページに移動します。
これにより、ユーザーが F5 キーを押すことによって引き起こされる繰り返し送信を回避でき、ブラウザーのフォームの繰り返し送信についての警告も表示されなくなり、ブラウザーの進むボタンと戻るボタンを押すことによって引き起こされる同じ問題も排除できます。
3. 特別なフラグ をセッションに保存します。フォーム ページが要求されると、特殊な文字列が生成されてセッションに保存され、フォームの非表示フィールドに配置されます。フォーム データを受け入れて処理するときは、識別文字列が存在するかどうかを確認し、直ちにセッションから削除して、データを通常どおり処理します。
フォーム送信に有効なフラグ文字列が存在しないことが判明した場合、フォームはすでに送信されており、この送信は無視されることを意味します。
これにより、Web アプリケーションにさらに高度な XSRF 保護が提供されます。
4. データベースに制約を追加します。 データの重複を防ぐために、データベースに一意の制約を追加するか、一意のインデックスを作成します。これは、データの重複送信を防ぐ最も効果的な方法です。
上記はこれら 4 つの方法の紹介です。より良い解決策があれば、この記事は引き続き更新されます。