ホームページ  >  記事  >  バックエンド開発  >  フォームの繰り返し送信を防ぐ方法に関する ThinkPHP のヒント

フォームの繰り返し送信を防ぐ方法に関する ThinkPHP のヒント

PHPz
PHPzオリジナル
2017-04-04 15:03:251337ブラウズ

開発中に

http

://www.php.cn/php/php-tp-append.html" target="_blank"> が追加または変更された場合、m フォームが繰り返し送信されます。 フォームが繰り返し送信される理由は、次回ページが送信されるか、ページが閉じるか他のページにリダイレクトされるまで、最初に送信されたフォームがメモリにキャッシュされるためです。自己呼び出しが返されますが、メモリ内のデータはまだ存在します。この時点でも、ページ内の送信コードは送信された値を検出できます。

問題を解決する方法と独自のテストを使用できます。次の方法:

方法 1

: 最も単純: ページを送信した後、このページの代わりに別のページに移動します。たとえば、ページのアドレスは

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

です。その場合、ページのフォーム

action

アドレスは次のようになります。エラーを返す

<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('click',function(){
            $(this).attr('disabled',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('TOKEN', authcode($code));
}
//判断TOKEN
function checkToken($token) {
    if ($token == session('TOKEN')) {
       session('TOKEN', NULL);
       return TRUE;
    } else {
      return FALSE;
    }
}
/* 加密TOKEN */
function authcode($str) {
    $key = "YOURKEY";
    $str = substr(md5($str), 8, 10);
    return md5($key . $str);
}
フォームページのformに次のHTMLコードを入力します

HTML:

<input type="hidden" name="TOKEN" value="{:session(&#39;TOKEN&#39;)}" />
creatToken()メソッドを呼び出してトークンを生成する前にページが表示され、対応する

コントローラー

でPOSTリクエスト

を行います。 checkToken()を使用して、再送信するかどうかを決定します

if(IS_POST)
{
$post_token = I('post.TOKEN');
  if(!checkToken($post_token)){
      $this->error('请不要重复提交页面',U('User/Index/login'));
  }
}
基本的に、これら3つのメソッドを一緒に使用して、ThinkPHPでフォームが繰り返し送信される問題を解決できますもちろん、一部の学生は ThinkPHP のトークン リング メカニズムを使用できると言いました。実際には、TP はデフォルトで隠しフィールドを生成し、その隠しフィールドが存在するかどうかを判断できます。原理はメソッド 3 と同じです。

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

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