ユーザーがフォームを繰り返し送信するのを防ぐ方法の概要

ユーザーがフォームを繰り返し送信するのを防ぐ方法の概要

重複したフォーム送信は、マルチユーザー Web アプリケーションで最も一般的で厄介な問題です。重複送信の問題が発生する可能性があるアプリケーション シナリオは多数あります。たとえば、次のようになります。

[送信] ボタンを 2 回クリックします。 「更新」ボタンをクリックします。 ブラウザの戻るボタンを使用して前の操作を繰り返すと、フォームの送信が重複して発生します。 ブラウザの履歴を使用して、フォームを繰り返し送信します。 ブラウザは HTTP リクエストを繰り返します。

フォームの重複送信を防ぐいくつかの方法

1. 送信ボタンを無効にします。フォームが送信された後に送信ボタンを無効にするには、Javascript を使用します。このアプローチにより、せっかちなユーザーがボタンを複数回クリックするのを防ぐことができます。しかし、問題があります。クライアントが Javascript を無効にしている場合、このメソッドは無効になります。

前回の記事で、いくつかの Jquery プラグインを使用すると良い効果が得られる可能性があると述べました。

2.Post/Redirect/Getモード。送信後にページ リダイレクトを実行することを、Post-Redirect-Get (PRG) パターンと呼びます。つまり、ユーザーがフォームを送信すると、送信成功情報ページへのクライアント側リダイレクトが実行されます。

これにより、ユーザーが F5 キーを押すことで発生する繰り返しの送信を回避でき、ブラウザー フォームを繰り返し送信しても警告が表示されなくなります。また、ブラウザーの進むボタンと戻るボタンを押すことで発生する同じ問題も解消されます。

3. セッションに特別なフラグを保存します。フォーム ページが要求されると、特殊な文字列が生成され、セッションに保存され、フォームの隠しフィールドに配置されます。フォーム データを受け入れて処理するときに、識別文字列が存在するかどうかを確認し、すぐにセッションから削除してから、データを通常どおり処理します。

フォーム送信に有効なフラグ文字列がないことが判明した場合、フォームは送信されており、送信は無視されることを意味します。

これにより、Web アプリケーションにさらに高度なレベルの XSRF 保護が提供されます。

4. データベースに制約を追加します。データの重複を防ぐには、データベースに一意の制約を追加するか、一意のインデックスを作成します。これは、データの重複送信を防ぐ最も効果的な方法です。

以上が4つの方法の紹介です。より良い解決策があればぜひ教えてください。この記事は今後も更新されていきます。

<<:  IE6、IE7、IE8 で CSS3 の丸い角と影のスタイルをサポートする

>>:  親要素に対する CSS 子要素の固定配置ソリューションの詳細な説明

推薦する

MySQL 5.7 および MySQL 8.0 でルートパスワードを変更する方法の概要

MySQL 5.7 バージョン:方法1: SET PASSWORDコマンドを使用するフォーマット: ...

WeChatアプレットAmapマルチポイントルート計画プロセス例の詳細な説明

電話Amap API を呼び出す方法は? Amap が https://lbs.amap.com/a...

Ubuntu 16.04 にソースコードから Mininet をインストールする

ミニネットMininet は軽量のソフトウェア定義ネットワークおよびテスト プラットフォームです。軽...

Linux 上で Python3.6 をコンパイルしてインストールするための詳細なチュートリアル

1. まず、公式ウェブサイト https://www.python.org/downloads/so...

Linux での MongoDB のインストールに関するチュートリアル

MongoDB はクロスプラットフォームであり、Windows と Linux の両方にインストール...

ページ切り替え効果を作成するための純粋な CSS3 のサンプルコード

前に書いたものは複雑すぎるので、シンプルなコアにしましょう <html> <ヘッド...

Windows 10 での MySQL 8.0.16 のインストールと設定のチュートリアル

この記事では、参考までにMySQL 8.0.16のインストールと設定方法のグラフィックチュートリアル...

CentOS7 での MySQL 8.0.16 のインストールと設定のチュートリアル

MySQLの古いバージョンをアンインストールします(古いバージョンがない場合は、この手順をスキップし...

MySQL 5.6 のインストール手順(画像とテキスト付き)

MySQL はオープンソースの小規模リレーショナル データベース管理システムです。現在、MySQL...

MySQLの比較演算子正規表現マッチングREGEXPの使用の詳細な説明

1. データを初期化する `test_01` が存在する場合はテーブルを削除します。 テーブル「te...

Linuxカーネルマクロcontainer_ofの詳細な分析

1. 前述の通り数年前、Linux ドライバーのコードを読んでいたときにこのマクロを見ました。長い間...

リモートログインとポート公開を防ぐためのLinuxサーバー構成IPホワイトリスト

序文ブロガーが使用しているサーバーは Alibaba Cloud から購入したものです。実際、Ali...

虫眼鏡コンポーネントのネイティブ js 実装

この記事の例では、参考までに虫眼鏡コンポーネントを開発するためのjsの具体的なコードを共有しています...

WeChatアプレットシングルページアプリケーションルーティングを徹底的に理解するための10分

シングルページアプリケーションの特徴「前提:」Web ページには、クリックするとサイト内の他のページ...

div が contentEditable=true に設定されている場合、コンテンツをリセットした後にカーソルを配置することはできません。

最近、絵文字にコメントする機能が必要なコメント機能に取り組んでいたため、 contentEditab...