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