Comment prévenir forme de soumettre plusieurs fois de côté client?
Parfois, lorsque la réponse est lente, on peut cliquer sur le bouton soumettre plusieurs fois.
Comment empêcher que cela se produise?
- J'espère que la raison pour laquelle vous mettez "côté client" sur votre question titre est parce que vous êtes conscient du fait que toute solution sur le client, et essayez d'éviter dupe des soumissions est 100% sécurisé et vous devriez toujours faire de la validation côté serveur.
- Paolo: Oui, si vous êtes intéressé, des données complètes de sécurité, il doit être fait côté serveur. Mais parfois vous voulez juste pour empêcher la grand-mère de double-cliquer sur le bouton soumettre quand il a seulement besoin d'un seul clic. Dans ces cas, le javascript est parfaitement bien.
- Le faire uniquement côté serveur n'est pas sûr à 100% ainsi, depuis votre première demande peut prendre assez longtemps pour terminer la deuxième pouvait savoir qu'il ne devait pas se poursuivre.
- N'est pas la Double-Soumettre Cookie Motif pour éviter les attaques de type CSRF également empêcher exerciseur la soumission d'un formulaire?
Vous devez vous connecter pour publier un commentaire.
Utiliser javascript discret pour désactiver l'événement submit du formulaire après il a déjà été soumis. Voici un exemple d'utilisation de jQuery.
EDIT: correction d'un problème avec l'envoi d'un formulaire sans cliquer sur le bouton soumettre. Merci, ichiban.
return true
? Je pense que la première soumettre devrait fonctionner sans cela.return true
est implicite si omis.$(this).find("input[type='submit']").attr('disabled', 'disabled').val('submiting'); return true; });
onkeypress="return event.keyCode != 13;"
ou ajouter le même code en ligne directement à une entrée de balise de l'élément qui va vous permettre d'utiliser la touche entrée dans un textarea où la première option peut poser un problème.$(this).find(':submit').prop('disabled', true)
comme un raccourci, et aussi de trouver des fichiers d'amorce du<button type="submit"
J'ai essayé vanstee de la solution avec asp mvc 3 discrète de validation, et si la validation échoue, le code est toujours en course, et soumettre le formulaire est désactivé pour de bon. Je ne suis pas en mesure de soumettre de nouveau après correction de champs. (voir bjan commentaire)
J'ai donc modifié vanstee du script comme ceci:
Côté Client formulaire de contrôle de la présentation peut être réalisé assez élégamment par avoir le onsubmit gestionnaire de masquer le bouton soumettre et de le remplacer par une animation de chargement. De cette façon, l'utilisateur obtient un retour visuel immédiat dans l'endroit même où son action (clic) qui est arrivé. Dans le même temps, vous empêcher le formulaire d'être soumis à un autre moment.
Si vous soumettez le formulaire via XHR garder à l'esprit que vous avez à gérer des erreurs de soumission, par exemple un délai d'attente. Vous devez afficher le bouton soumettre de nouveau parce que l'utilisateur doit soumettre à nouveau le formulaire.
Sur une autre note, llimllib apporte un point très valable. Tous la validation d'un formulaire qui doit arriver du côté serveur. Cela inclut de multiples soumission des contrôles. Jamais la confiance du client! Ce n'est pas seulement une affaire si javascript est désactivé. Vous devez garder à l'esprit que tous les côté client code peut être modifié. Il est un peu difficile à imaginer, mais le html/javascript en parler à votre serveur n'est pas nécessairement le code html/javascript que vous avez écrit.
Comme llimllib suggère, générer le formulaire avec un identificateur unique pour la forme et le mettre dans un champ caché. Magasin identifiant. Lors de la réception des données de formulaire ne traiter que lorsque l'identificateur de matchs. (Également le lien entre l'identificateur de la session des utilisateurs et la correspondance, ainsi, pour plus de sécurité.) Après le traitement de données à supprimer l'identifiant.
Bien sûr, de temps en temps, vous aurez besoin de nettoyer les identifiants qui ne sont jamais toutes les données de formulaire a été soumis. Mais plus que probablement votre site web emploie déjà une sorte de "garbage collection" mécanisme.
Voici une façon simple de le faire:
<form onsubmit="return (typeof submitted == 'undefined') ? (submitted = true) : !submitted">
, ou écrirevar submitted = false;
à le point à droite de votre script, pour éviter l'erreur suivante:Uncaught ReferenceError: submitted is not defined
.Désactiver le bouton soumettre bientôt après un clic. Assurez-vous de gérer les validations correctement. Aussi garder une page intermédiaire pour toutes les opérations de traitement de bases de données ou des opérations, et ensuite rediriger à la page suivante. Cela permet de s'assurer que l'actualisation de la deuxième page ne prend pas en faire un autre traitement.
form page ---submits to---> form_submission_script.php ---after saving, redirects to---> form_thankyou.html
Vous pouvez aussi afficher une barre de progression ou un compteur pour indiquer que le formulaire est en cours de traitement.
De hachage à l'heure actuelle, d'en faire un caché d'entrée sur le formulaire. Sur le côté serveur, vérifier le hash de chaque formulaire de soumission; si vous avez déjà reçu que de hachage, puis vous avez une répétition de la présentation.
edit: en s'appuyant sur le javascript n'est pas une bonne idée, donc vous pouvez garder upvoting ces idées, mais certains utilisateurs ne l'ont pas permis. La bonne réponse est de ne pas faire confiance la saisie de l'utilisateur sur le serveur.
À l'aide de JQuery que vous pouvez faire:
&
Je sais que vous avez attaché votre question avec 'javascript', mais voici une solution qui ne dépend pas de javascript:
C'est une webapp modèle nommé PRG, et voici un bon article qui le décrit
Vous pouvez empêcher plusieurs soumettre simplement avec :
Workin =true;
. Double soumet sont encore possible, mais moins probable.Vous pouvez essayer safeform plugin jquery.
La plus simple de répondre à cette question, comme l'a demandé: "Parfois, lorsque la réponse est lente, on peut cliquer sur le bouton soumettre plusieurs fois. Comment faire pour empêcher que cela se produise?"
Il suffit de Désactiver la forme bouton soumettre, comme le code ci-dessous.
Il permet de désactiver le bouton soumettre, sur cliquez d'abord pour la présentation. Aussi, si vous avez quelques règles de validation, puis il fonctionne très bien. J'espère que ça aidera.
Sur le côté client, vous devez désactiver le bouton soumettre une fois le formulaire soumis avec du code javascript comme la méthode fournie par @vanstee et @chaos.
Mais il y a un problème de latence réseau ou javascript est désactivé situation où vous ne devriez pas compter sur le JS pour empêcher que cela se produise.
Donc, sur le côté serveur, vous devez vérifier la répétition de la soumission de la même clientèle et d'omettre ce qui est répété qui semble une fausse tentative de la part de l'utilisateur.
Le principe le plus simple et élégante solution pour moi:
Lien pour en savoir plus...
Utiliser ce code dans votre formulaire.il sera en charge de multiples clics.
il va travailler pour vous.
la meilleure façon de prévenir plusieurs de soumission est ce
il suffit de passer le bouton id dans la méthode.
Pour ce faire à l'aide de javascript est un peu facile. Voici le code qui va donner de la fonctionnalité souhaitée :
JS:
HTML:
Plus simple des solutions est que de désactiver le bouton de clic, l'activer une fois l'opération terminée. Pour vérifier solution similaire sur jsfiddle :
Et vous pouvez trouver une autre solution sur ce réponse.
Cela fonctionne très bien pour moi. Il soumettre la ferme et de faire bouton désactiver et au bout de 2 sec active le bouton.
Dans ECMA6 Syntex
Juste à ajouter aux réponses possibles sans en contournant le navigateur de validation de la saisie
Cela vous permet de soumettre toutes les 2 secondes. Dans le cas de l'avant validation.
Une alternative à ce qui était proposé avant est: