Heim  >  Artikel  >  Backend-Entwicklung  >  ThinkPHP-Methode, um das wiederholte Senden von Formularen zu verhindern

ThinkPHP-Methode, um das wiederholte Senden von Formularen zu verhindern

不言
不言Original
2018-06-01 13:52:551436Durchsuche

In diesem Artikel wird hauptsächlich die Methode von ThinkPHP zur Verhinderung der wiederholten Übermittlung von Formularen vorgestellt. Er analysiert verschiedene gängige Betriebstechniken und die damit verbundenen Vorsichtsmaßnahmen von thinkPHP, um die wiederholte Übermittlung von Formularen in Form von Beispielen zu verhindern

Dieser Artikel fasst die Methode von ThinkPHP zur Verhinderung wiederholter Formularübermittlungen anhand von Beispielen zusammen und analysiert sie. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Warum gibt es doppelte Formulare?

Während der Entwicklung, wenn ein neues oder Für das geänderte Formular legen wir nach Abschluss des Datenbankvorgangs im Hintergrund fest, ob zu anderen Seiten gesprungen oder zu dieser Seite zurückgekehrt werden soll. Zu diesem Zeitpunkt wird das Formular durch Klicken auf die Zurück-Schaltfläche des Browsers vor dem Absenden oder Aktualisieren der Seite angezeigt wiederholt eingereicht werden, d. h. dieser Datensatz wird zweimal hinzugefügt oder geändert.

Der Grund, warum das Formular wiederholt gesendet wird, besteht darin, dass das zum ersten Mal gesendete Formular im Speicher zwischengespeichert wird und nicht verschwindet, bis die Seite das nächste Mal gesendet oder die Seite geschlossen oder auf eine andere umgeleitet wird Seiten. Wenn der Selbstaufruf zurückkehrt, sind die Daten im Speicher noch vorhanden. Zu diesem Zeitpunkt kann der übermittelte Code auf der Seite den übermittelten Wert noch erkennen, was den Effekt einer wiederholten Übermittlung verursacht.

Wie löst man das Problem?

Um Online-Lösungen und eigene Tests zusammenzufassen, können Sie die folgenden Methoden verwenden:

Methode 1: Die einfachste: nach dem Absenden der Seite Gehen Sie zu einer anderen Seite anstelle dieser Seite. Ihre Seitenadresse lautet beispielsweise

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

Dann das Formular Die Aktionsadresse der Seite kann eine andere Verarbeitungsadresse sein, z. B.

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

. Auf diese Weise wird ein Fehler zurückgegeben oder der Benutzer klickt auf die Schaltfläche „Zurück“ und fährt fort kehrt zur vorherigen Adresse zurück, aber diese Situation ist nicht sicher. Es ist auch notwendig, Methode 2 abzugleichen, um gemeinsam sicherer zu sein

Methode 2: Nach dem Absenden des Formulars wird die Schaltfläche „Senden“ grau/versteckt die Schaltfläche „Senden“

Diese Methode Wird normalerweise mit Methode 1 kombiniert. Sie verwenden JS, um die Klickaktion des Benutzers dynamisch zu überwachen und das Schaltflächenattribut dynamisch auf „disabeld“ zu setzen, was bedeutet, dass es grau und nicht verfügbar ist. Der Code lautet wie folgt:

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);
   });
});

Nach der Kombination von Methode 1 + Methode 2 können im Grunde mehr als 90 % der Probleme mit wiederholten Einreichungen gelöst werden, aber Liu möchte immer noch über die dritte Methode sprechen, die darin besteht, dieses Problem ein für alle Mal zu lösen Server

Methode 3: Verwenden Sie die Methode zum Ausblenden zufälliger TOKEN-Werte, um wiederholte Übermittlungen zu ermitteln

Fügen Sie zunächst die folgende Methode hinzu Projektfunktionen.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);
}

Füllen Sie den folgenden HTML-Code in das Formularseitenformular ein

HTML:

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

Rufen Sie die Methode creatToken() auf, um ein Token zu generieren, bevor die Seite angezeigt wird, und verwenden Sie checkToken() in der entsprechenden Controller-POST-Anfrage, um zu bestimmen, ob

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

Grundsätzlich können Sie diese drei Methoden zusammen verwenden, um das Problem der wiederholten Formularübermittlung in der ThinkPHP-Entwicklung zu lösen. Natürlich sagten einige Studenten, dass Sie den Token-Ring-Mechanismus von ThinkPHP verwenden können, der tatsächlich einfacher ist TP generiert standardmäßig ein verstecktes Feld im Formular. Anschließend kann beurteilt werden, ob dieses versteckte Feld vorhanden ist und ob es mit dem Wert in der Sitzung übereinstimmt.

PS:Heute habe ich den Inhalt endlich mit dem Markdown-Editor von Jianshu gepostet. Tatsächlich wurde die Markdown-Syntax nicht abgedeckt und das gesamte Layout war erfrischend, nicht schlecht.

Verwandte Empfehlungen:

PHP implementiert die Funktion zur Verhinderung wiederholter Formularübermittlungen (basierend auf der Token-Verifizierung)

Das obige ist der detaillierte Inhalt vonThinkPHP-Methode, um das wiederholte Senden von Formularen zu verhindern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn