ページの重複投稿を防ぐ方法まとめ

WBOY
リリース: 2016-06-21 08:48:47
オリジナル
797 人が閲覧しました

場合によっては、プログラムの実行が遅くなり、ページがあまりフレンドリーではなく、プロンプト情報が表示されないことがあります。オペレータは、送信ボタンがクリックされていないと考えた場合、再度送信ボタンをクリックします。これは多くの問題を引き起こす可能性があります。重複投稿を防ぐ3つの方法をご紹介します。

1. 送信ボタンが無効になっています

ユーザーが送信すると、ボタンはすぐに無効になります。これはjsを使って実装されています。

送信する前に

$("#submit").attr('disabled','true');

$("#submit").val("送信中です、お待ちください");

................................................................................... ...................................

実行後、ボタンを元の状態に戻します

$('#submit ').removeAttr('disabled');

$("#submit ").val("送信の確認");

2. 有効期限の方法

アイデア: ユーザーがボタンを送信すると、トークンが生成され (トークンはビジネス送信ごとに一意の値です)、セッションに保存され、有効期限が設定されます。ユーザーが再度送信するときに、トークンが一貫していて期限切れであるかどうかを確認します。一貫性があり、期限切れになっていない場合は、2 回送信されたとみなされます。プログラムの実行中にエラーが発生した場合、セッションに保存されている値をクリアする必要があります。手順は以下をご覧ください

関数 checkRepeatSubmit($uniqueid = '', $expire = 30) {

$uniqueid = empty($uniqueid) ? Yii::app()->user->id . Yii::app()-> ;user->mihome : $uniqueid;

$token = md5("wms_check_repeat" . $uniqueid);

$time = time();

if (isset($_SESSION['token']) && !empty($_SESSION['token']) && $_SESSION['token'] == $token && ($time - $_SESSION['expire_time' ] < $期限切れ)) {

false を返します;

} else {

$_SESSION['token'] = $token;

$_SESSION['expire_time'] = $time;

// セッション 書き込み時にページ全体がロードされるまで待機します。この関数を使用して

をすぐに書き込みます。

session_write_close();

true を返します;

}

}

//保存された値を削除します

関数 cancelRepeatSubmit() {

unset($_SESSION['token']);

unset($_SESSION['expire_time']);

}

3. トークンの破棄方法

アイデア: ページが追加されると、トークンが生成され、セッションに保存され、フォームに書き込まれます。フォームが送信されると、サーバーはセッションに保存されているトークンとトークンを比較し、ページが送信されると、セッションに保存されているトークンが破棄されます。 2 回目では、セッションに保存されているトークンが破棄され、トークンが存在しないため、エラーが報告されます。以下はコードです

/**

* 2 番目のオプション

* 1. トークンを生成し、セッションに保存します

* 2. ページ

で生成します

* 3. 送信されたページとセッションを比較し、成功後にセッションを破棄します

* 4. 2 回目の送信では、この値は存在せず、エラーが報告されます

* @param type $uniqueid

* @return type

*/

関数 createToken($uniqueid) {

$uniqueid = empty($uniqueid) ? Yii::app()->user->id . Yii::app()-> ;user->mihome : $uniqueid;

$token = md5("wms_check2_repeat" . $uniqueid);

$_SESSION['form_token'] = $token;

session_write_close();

$token を返す;

}

関数 checkToken($token) {

if (!isset($_SESSION['form_token']) empty($_SESSION['form_token']) $_SESSION['form_token'] != $token) {

false を返します;

} else {

true を返します;

}

}

上記に 3 つの方法をまとめましたが、個人的には 1 つ目と 2 つ目の方法を併用するとより良い結果が得られると感じています。 2 番目の方法と 3 番目の方法 個人的には、3 番目の方法に利点があると感じます。

2 番目と 3 番目のメソッドはどちらもセッション内にトークンを書き込みます。このメソッドの利点はストレージ領域を節約できることですが、欠点は、セッションが書き込む前にページ全体をロードする必要があることです。ページ全体が読み込まれても、処理が遅く、ユーザーが送信を複数回クリックしても、セッションがまだ書き込まれていないため、システムはこれが最初の入力であると認識する可能性があります。検証が機能しなくなります。幸いなことに、php 関数は素晴らしい機能を提供します。 session_write_close() を使用すると、ページのロードを待たずにすぐにセッションを書き込むことができます。同僚には、redis、memcache、データベースなど、セッションを保存するための多くのオプションもあります。



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!