ホームページ >PHPフレームワーク >ThinkPHP >フォームの繰り返し送信を防ぐための Thinkphp のヒント

フォームの繰り返し送信を防ぐための Thinkphp のヒント

尚
転載
2020-04-11 09:02:192823ブラウズ

開発中、フォームの追加や変更を行った場合、バックグラウンドでデータベースの操作が完了した後、他のページにジャンプしたり、このページに戻らないように設定しておりますが、その際はブラウザの「戻る」ボタンをクリックしてから行ってください。ページを送信または更新すると、フォームが繰り返し送信されます。つまり、このレコードは 2 回追加または変更されます。

フォームの繰り返し送信を防ぐための Thinkphp のヒント

フォームが繰り返し送信される理由は、初めて送信されたフォームが、次回またはページが送信されるまでメモリにキャッシュされるためです。閉じられるか、他のページにリダイレクトされます。セルフコールが戻ったとき、メモリ内のデータはまだそこにありますが、この時点では、ページ内のサブミットされたコードはまだサブミットされた値を検出できるため、繰り返しサブミットの影響が生じます。

次の方法を使用して解決できます:

方法 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% 以上が解決されます。しかし、Da 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);
}

に以下のメソッドを追加しますフォームページのform

HTML:

<input type="hidden" name="TOKEN" value="{:session(&#39;TOKEN&#39;)}" />
##に以下のHTMLコードを記入します。 #ページが表示される前に creatToken() メソッドを呼び出してトークンを生成し、対応するコントローラーの POST リクエストで checkToken() を使用して、繰り返し送信するかどうかを決定します

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

基本的に、これら 3 つのメソッドを一緒に使用して、 ThinkPHP 開発におけるフォームの繰り返し送信の問題を解決します もちろん一部の学生は ThinkPHP のトークンリング機構を使用できると言われていますが、実際にはその方が簡単です TP はデフォルトでフォームに隠しフィールドを生成します そのとき、隠しフィールドが存在するかどうか、セッション内の値と一致するかどうかを判定することができ、原理は同じで、方法3も同様です。

推奨チュートリアル:

thinkphp チュートリアル

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

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。