Méthode ThinkPHP pour éviter la soumission répétée de formulaires

不言
Libérer: 2023-03-29 07:18:01
original
1497 Les gens l'ont consulté

Cet article présente principalement la méthode de ThinkPHP pour empêcher la soumission répétée de formulaires. Il analyse diverses techniques de fonctionnement courantes et les précautions associées de thinkPHP pour empêcher la soumission répétée de formulaires sous forme d'exemples. Les amis dans le besoin peuvent s'y référer

<.> Cet article résume et analyse la méthode de ThinkPHP pour empêcher les soumissions répétées de formulaires à travers des exemples. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Pourquoi y a-t-il des formulaires en double ?

Pendant le développement, si un nouveau ou Pour le formulaire modifié, après avoir terminé l'opération de base de données en arrière-plan, nous définissons s'il faut accéder à d'autres pages ou revenir à cette page. À ce stade, cliquer sur le bouton Précédent du navigateur avant de soumettre ou d'actualiser la page entraînera l'affichage du formulaire. être soumis à plusieurs reprises, c'est-à-dire que cet enregistrement sera ajouté ou modifié deux fois.

La raison pour laquelle le formulaire est soumis à plusieurs reprises est que le formulaire soumis pour la première fois sera mis en cache dans la mémoire et ne disparaîtra que la prochaine fois que la page sera soumise ou que la page sera fermée ou redirigée vers d'autres pages. Lorsque l'auto-appel revient, les données en mémoire sont toujours là. À ce moment, le code soumis dans la page peut toujours détecter la valeur soumise, ce qui entraînera l'effet d'une soumission répétée.

Comment le résoudre ?

Pour résumer les solutions en ligne et vos propres tests, vous pouvez utiliser les méthodes suivantes :

Méthode 1 : La plus simple : après avoir soumis la page Accédez à une autre page au lieu de cette page. Par exemple, l'adresse de votre page est

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

Puis le formulaire. l'adresse d'action de la page peut être une autre adresse de traitement, telle que

<form action="{:U(&#39;User/Index/check_login&#39;)}" method="post">
Copier après la connexion

De cette façon, une erreur revient, ou l'utilisateur clique sur le bouton de retour, ou le Retour à l'adresse précédente, mais cette situation n'est pas sûre. Il est également nécessaire de faire correspondre la méthode 2 pour être plus en sécurité ensemble

Méthode 2 : Après avoir soumis le formulaire, le bouton de soumission devient gris/masquer le bouton de soumission

Cette méthode est généralement combiné avec la méthode 1. Ce que vous faites est d'utiliser JS pour surveiller dynamiquement l'action de clic de l'utilisateur et de définir dynamiquement l'attribut du bouton sur désactivé, ce qui signifie qu'il est gris et indisponible. Le code est le suivant :

HTML :

<form action="{:U(&#39;User/Index/check_login&#39;)}" method="post">
  
  
  
Copier après la connexion

JS :

$().ready(function(){
   $("#login_btn").on(&#39;click&#39;,function(){
      $(this).attr(&#39;disabled&#39;,true);
   });
});
Copier après la connexion

Après la combinaison de la méthode 1 + méthode 2, en gros, plus de 90 % des problèmes de soumission répétés peuvent être résolus, mais Da Liu veut toujours parler de la troisième méthode, qui consiste à résoudre ce problème une fois et pour tous côté serveur

Méthode 3 : Utilisez la méthode de masquage des valeurs TOKEN aléatoires pour déterminer les soumissions répétées

Tout d'abord, ajoutez la méthode suivante au fonctions.php du projet

//创建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);
}
Copier après la connexion

Remplissez le code HTML suivant dans le formulaire de la page de formulaire

HTML :

<input type="hidden" name="TOKEN" value="{:session(&#39;TOKEN&#39;)}" />
Copier après la connexion

Appelez la méthode

pour générer un jeton avant l'affichage de la page, et utilisez creatToken() dans la requête POST du contrôleur correspondant pour déterminer s'il faut soumettre à nouveau 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;));
 }
}
Copier après la connexion

Fondamentalement, ces trois méthodes peuvent être utilisées ensemble pour résoudre le problème de la soumission répétée de formulaires dans le développement ThinkPHP. Bien sûr, certains étudiants. a dit que vous pouvez utiliser le mécanisme Token Ring de ThinkPHP, qui est en fait plus simple. TP générera par défaut un champ caché dans le formulaire. À ce moment-là, il sera possible de juger si le champ caché existe et s'il correspond à la valeur de la session. Le principe est le même que la méthode 3.

PS :Aujourd'hui, j'ai finalement publié le contenu à l'aide de l'éditeur de démarques de Jianshu. Effectivement, la syntaxe de démarque n'était pas couverte et la mise en page entière était rafraîchissante, pas mal.

Recommandations associées :

PHP implémente la fonction permettant d'empêcher l'envoi répété de formulaires (basé sur la vérification du jeton)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal