ユーザーが誤って送信ボタンを複数回クリックする可能性がある状況を処理するにはどうすればよいですか? これが発生すると、テーブルに 2 つの行が生成されます。それを回避する方法。私はJSPで働いています。
また、データベースへの二重入力の問題を引き起こすback
ボタンやページも避けたいと考えています。refresh
いくつかの方法:
送信ボタンで 2 回のクリックを禁止するために JavaScript を使用できますが、ユーザーが 2 回のクリックの間にナビゲーターの「戻る」ボタンを使用すると機能しません。
サーバー側では、ユーザーセッションに保持された一意の ID を使用してフォームを送信できます (CSRF 対策にも使用できます)。次に、フォームを送信するときに、ユーザーセッションで比較してIDを削除できます。セッションへの同時アクセスには注意してください (各リクエストには独自のスレッドがあります)。
データベースで検出しますが、データとその制約に依存します。ポイント 2 の 1 つの拡張は、フォームの生成された ID をデータベースに保持し、最初のアクセス時にそれを削除することです。この方法には、同時アクセスの場合にトランザクション サポートを利用できるという利点があります。
フォームがデータベース内の特定のエントリを更新する場合 (行 ID がフォームと共に送信される)、同じデータで同じ行を 2 回更新するため、問題はそれ自体で解決されたと見なすことができます。
クライアント側に頼りすぎないようにすることをお勧めします。非常にアクセスしやすいツールを使用すると、クライアント側で適用される動作をほとんど変更できます。クライアント側で何かが失敗した後にアプリケーションがクラッシュしたり、未定義の動作をしたりする場合は、アプリケーションを変更する必要があります。
できることの 1 つは、この POST の結果のすべてのフィールドを取得するクラスを作成し、その equals() メソッドをオーバーライドしてすべてのフィールドを尊重し、ユーザー レベルでリクエストを保持し、他のすべての受信リクエストをリクエストのリストと比較することです。あなたはすでにそのユーザーのために持っています。
リクエスト オブジェクトは、正常に処理されたらすぐに削除できます。
一方、(ユーザーがリクエストを POST するたびに「オープン」リクエストのリストを調べることによって) 何らかの形でユーザーから同じリクエストを再度受け取った場合は、それを無視することができます。
まず、クライアント側で、ユーザーが一度クリックするとすぐにボタンを無効にします。
次に、サーバー側では、その形式の一部の情報がデータベース テーブルの主キーになります。したがって、データの挿入中に同じ情報がサーバーに再度送信されると、主キーの値が重複することはできないため、例外が発生します。
送信ボタンを 2 回クリックできないことを 100% 確実にしたい場合は、ボタンの onclick= メソッド内の JavaScript で無効にすることができます。
たとえば、以下の javascript (jquery) で、ボタン ID が「send」だった場合は...
$('#send').click(function(e) {
this.disabled = true;
businessLogicCall();
});
最初の解決策。送信ボタンを無効にします..可能であれば、いくつかの一意のキーを2番目に確認してください...
送信ボタンを無効にするなど、ボタンのクリックを受け付けない待ち時間を設けます。
ユーザーが入力情報を変更するまで送信ボタンを無効にし、別の部分の情報を送信したいことを示します。