ホームページ  >  記事  >  バックエンド開発  >  フォームの繰り返し送信を防ぐ ThinkPHP メソッド

フォームの繰り返し送信を防ぐ ThinkPHP メソッド

不言
不言オリジナル
2018-06-01 13:52:551436ブラウズ

この記事では、フォームの重複送信を防止するための ThinkPHP の方法を主に紹介し、フォームの重複送信を防止するための thinkPHP のさまざまな一般的な操作テクニックと関連する注意事項をサンプルの形で紹介します。 ThinkPHP の概要と分析を例とともに示します。参考までに、詳細は次のとおりです:

なぜ重複フォームの落とし穴があるのですか? 開発中に新しいフォームが追加または変更された場合、設定は行われません。バックグラウンドでのデータベース操作が完了した後のジャンプ。ページを送信または更新する前にブラウザの戻るボタンをクリックすると、フォームが繰り返し送信されます。つまり、このレコードが追加されます。 2回修正されました。

フォームが繰り返し送信される理由は、初めて送信されたフォームがメモリにキャッシュされ、次回ページが送信されるか、ページが閉じられるか他のページにリダイレクトされるまで消えないためです。自己呼び出しが返されるとき、メモリ内のデータはまだ存在しており、この時点でページ内の送信されたコードは送信された値を検出できるため、繰り返し送信されることになります。

どうやって解決しますか? オンラインソリューションと独自のテストを要約するには、次の方法を使用できます:

方法 1:

最も簡単: ページを送信した後、このページではなく別のページに移動します。ページのアドレスが

http://yourdomain.com/User/Index/login

の場合、ページのフォーム アクション アドレスは、

<form action="{:U(&#39;User/Index/check_login&#39;)}" method="post">

などの別の処理アドレスにすることができます。 、エラーが返されるか、ユーザーが「戻る」ボタンをクリックしても前のアドレスに戻りますが、この状況は安全ではありません。より安全にするために、方法 2 も一致させる必要があります

方法 2:

フォームを送信すると、送信ボタンが灰色に変わります/送信ボタンが非表示になりますこの方法は通常、方法 1 と組み合わせて実行され、動的に監視されますJS を介したユーザーのクリック アクションは、ボタン属性を動的に無効に設定します。つまり、グレーで使用不可になります。コードは次のとおりです。

HTML:

<form action="{:U(&#39;User/Index/check_login&#39;)}" method="post">
  
  
  

JS:

$().ready(function(){
   $("#login_btn").on(&#39;click&#39;,function(){
      $(this).attr(&#39;disabled&#39;,true);
   });
});

方法 1 + 方法 2 結合後、基本的に重複送信の問題の 90% 以上は解決できますが、Liu はまだここでそれを行う必要があります。 3 番目の方法について説明します。これは、サーバー側でこの問題を完全に解決することです

方法 3:

ランダムな TOKEN 値を非表示にする方法を使用して、繰り返し送信を判断します まず、プロジェクトのfunctions.phpに以下のメソッドを追加します

//创建TOKEN
function createToken() {
  $code = chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) .    chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) . chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE));
  session(&#39;TOKEN&#39;, authcode($code));
}
//判断TOKEN
function checkToken($token) {
  if ($token == session(&#39;TOKEN&#39;)) {
    session(&#39;TOKEN&#39;, NULL);
    return TRUE;
  } else {
   return FALSE;
  }
}
/* 加密TOKEN */
function authcode($str) {
  $key = "YOURKEY";
  $str = substr(md5($str), 8, 10);
  return md5($key . $str);
}
单 フォームページ

Htmlのフォームページに以下のHTMLコードを記入します:

<input type="hidden" name="TOKEN" value="{:session(&#39;TOKEN&#39;)}" />

ページ表示前にページを呼び出します

の送信を繰り返すかどうかを決定する

if(IS_POST)
{
$post_token = I(&#39;post.TOKEN&#39;);
 if(!checkToken($post_token)){
   $this->error(&#39;请不要重复提交页面&#39;,U(&#39;User/Index/login&#39;));
 }
}
E

creatToken()方法生成token,在相应控制器POST请求中 使用 checkToken()

基本、これが基本、これが基本、これ 3 つの方法を一緒に使用して、ThinkPHP 開発におけるフォームの繰り返し送信の問題を解決できます。もちろん、一部の学生は、ThinkPHP のトークン リング メカニズムを使用できると言いました。実際には、TP はデフォルトで非表示フィールドを生成しますが、この非表示フィールドが存在するかどうか、およびそれがフォームに一致するかどうかを判断するだけで十分です。原理は方法 3 と同じです。

追記:

今日、ついに Jianshu のマークダウン エディターを使用してコンテンツを投稿しました。案の定、マークダウン構文はカバーされておらず、全体のレイアウトは新しく、悪くありませんでした。

関連する推奨事項:

PHP は、フォームの繰り返し送信を防止する機能を実装します (トークン検証に基づいて)

以上がフォームの繰り返し送信を防ぐ ThinkPHP メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。