Résoudre le Double Problème d'envoi de
Je voudrais voir comment les Développeurs Web à éviter la double soumission problème. Donc, fondamentalement, ma compréhension du problème est comme suit:
Double soumission se produit lorsque impatiente un utilisateur soumet un formulaire à plusieurs reprises, à l'origine de problèmes. Ce problème peut être résolu par JavaScript (plus précisément de scripts jQuery) que de désactiver le bouton "soumettre" une fois que le formulaire a été soumis à une faiblesse de ceci est que si les clients ont désactivé JavaScript.
Il y a aussi le côté serveur de méthodes de détection.
Donc mes questions sont:
Comment surmonter la double soumission?
Qu'est ce qu'un exemple de la vie réelle d'un problème causé par double soumet?
N'importe quelle Application Web de Cadres ont la double soumission outils intégrés?
- Exemple réel par paypal en ajoutant des éléments à la shoppin panier à plusieurs reprises,puisque l'utilisateur n'a pas obtenu de réponse , alors que la première demande est toujours en cours.
- Voir question à ce sujet: stackoverflow.com/questions/2830542/...
Vous devez vous connecter pour publier un commentaire.
Si vous travaillez avec java scripts côté serveur et également l'utilisation de struts 2, alors vous consultez ce lien qui parle sur l'aide jeton .
http://www.xinotes.org/notes/note/369/
Un jeton doit être généré et maintenu dans la séance de la première page de rendu, lorsque la demande est soumise avec le jeton pour la première fois , dans struts action exécuter un filetage avec filetage nom de l'id de jeton et exécuter la logique de tout ce que le client a demandé , lors de la client soumettre de nouveau la même demande, vérifiez si le fil est toujours en cours d'exécution(thread.getcurrentthread().interrompu) en cas d'exécution puis de l'envoyer à un client de redirection 503.
Veuillez jeter un oeil à la ExecuteAndWaitInterceptor de struts 2code, la logique de ceci, combiné avec le jeton de l'aide rapidement et cliquez sur
En situation réelle: placer des paris sur un site de paris. Les utilisateurs auraient la double clic et d'obtenir deux paris placés. Pas bon!!! Javascript vérifications n'ont pas été suffisantes pour empêcher cela.
Solution:
Créer UUID/GUID caché d'entrée en forme à l'aide de scripts côté serveur de la langue qui rend le formulaire.
Sur le formulaire de soumission immédiatement ajouter à une table de base de données appelé
UniqueSubmissions
(par exemple). Puis poursuivez le traitement.Chaque demande ultérieure ayant le même UUID/GUID sera rejetée s'il est trouvé dans la
UniqueSubmissions
table.Cela a fonctionné pour nous. L'espoir qui permet de répondre à votre question!
createUUID()
.document.querySelector("#submitbutton").addEventListener("click",function(ev){ev.target.disabled=true;});
- en supposant que l'actualisation de la page après avoir cliqué sur, par opposition à un XMLHttpRequest ou simmilar réponseUtiliser le redirection après-post ou parfois appelé PRG (post/redirect/get)
En bref, lorsque l'utilisateur soumet le formulaire, vous pouvez effectuer une redirection côté client (après avoir consommé le post de données) à la réponse (succès) de la page.
Un exemple réel serait cette réponse posté deux fois ;-).
Si vous ne voulez pas compter sur un quelconque aspect du côté client (javascript, ou même des cookies), vous pouvez calculer un hash MD5 de la base des données présentées, éventuellement en ajoutant des informations telles que l'adresse IP source et le type de navigateur utilisé, et de rejeter les postes qui ont le même hash.
La web2py cadre a protection intégrée contre la double soumission de formulaire. Il stocke un jeton dans la session ainsi que dans un champ caché dans le formulaire, et ils doivent correspondre moment de la soumission ou de la soumission est rejetée. De plus, cette méthode protège contre les CSRF (cross-site request forgery).
import uuid
form.process(formname=uuid.uuid4())
. Maintenant, le formulaire est un nom unique à chaque fois qu'il est créé, si la même page est ouverte dans plusieurs onglets du navigateur/windows, la forme a un nom différent sur chaque page. Le jeton est associé avec le nom de formulaire, donc l'ouverture d'un deuxième page n'interfère pas avec le jeton de la première page.Si le formulaire a l'intention de fournir une interface pour l'enregistrement de certaines données dans le serveur de bases de données, vous pouvez utiliser de révision spéciales champ est obligatoire pour les données soumises. A vérifier si oui ou non le soumis de révision correspond à la dernière version des données dans la base de données (ou est-ce un nouveau morceau de l'insertion de données), pourrait vous fournir avec un bon contrôle que faire si plusieurs soumet sont effectués dans l'ordre.
En utilisant struts web-application du cadre de nous peut gérer ce problème comme suit:
Struts a 3 méthodes utiliser pour le
token, saveToken(), isTokenValid() and resetToken()
.saveToken()
- générer le jeton de clé et de les sauvegarder sur demande/attribut de session.isTokenValid()
- valider soumis jeton de clé contre l'1 magasin dans la demande/session.resetToken()
- réinitialiser le jeton de clé.Comment cela fonctionne:
1) Sur l'écran de chargement, invoque
saveToken()
sur la classe de l'action de créer et de stocker le jeton de clé. Struts va stocker la clé générée à la demande/session. Si le jeton créé avec succès, lors de l'affichage de la source sur le navigateur, vous verrez quelque chose de similaire à la suivante, le jeton de clé est stockée comme un champ caché:2) une Fois le formulaire soumis, invoque
isTokenValid()
sur l'action de la classe, il devra valider l'soumis jeton de clé(champ caché) avec le jeton de clé stockée précédemment sur demande/session. Si match, il retournera true.référence