Question

Je voudrais voir comment les développeurs Web éviter le problème de la double soumission. Donc, fondamentalement, ma compréhension du problème est la suivante:

Double soumission se produit lorsqu'un utilisateur soumet une forme d'impatience plusieurs fois, ce qui provoque des problèmes. Ce problème peut être résolu par JavaScript (en particulier Scripts jQuery) qui désactivent le bouton Soumettre une fois que le formulaire a été soumis - une faiblesse de c'est si les clients ont désactivé JavaScript.

Il y a aussi des méthodes de détection côté serveur.

Alors mes questions sont:

Comment les gens à éviter la double soumission? Qu'est-ce qu'un exemple de la vie réelle d'un problème causé par une double soumet? Faites des cadres d'applications Web ont des outils à double soumission construit en?

Était-ce utile?

La solution

Si vous travaillez avec les scripts côté serveur java et aussi à l'aide de barres 2 vous référer ce lien qui parle sur l'utilisation de jetons.

http://www.xinotes.org/notes/note/369/

Un jeton doit être généré et maintenu en session pour la première page rendu, lorsque la demande est soumise avec le jeton pour la première fois, dans l'action des entretoises courir un fil avec le nom de fil comme l'ID jeton et exécuter la logique tout le client a demandé pour, lorsque le client soumet à nouveau la même demande, vérifier si le fil est toujours en cours (thread.getcurrentthread (). interrompu) si vous utilisez encore alors envoyer une redirection client 503.

S'il vous plaît regardez la ExecuteAndWaitInterceptor des entretoises 2code, la logique de ce combiné avec jeton aider cliquez rapide

Autres conseils

Situation de vie: placer des paris sur un site de paris. Les utilisateurs doubleraient clic et d'obtenir deux paris placés. Pas bon! contrôles Javascript ne sont pas suffisantes pour empêcher cela.

Solution:

  1. UUID / GUID entrée cachée sous une forme utilisant un langage de script côté serveur qui rend le formulaire.

  2. Sur la soumission du formulaire ajouter immédiatement ce à une table de base de données appelée UniqueSubmissions (par exemple). Ensuite, procéder au traitement.

  3. Chaque demande ultérieure avec le même UUID / GUID sera rejetée si trouvé dans la table UniqueSubmissions.

Cela a fonctionné pour nous. J'espère que cela répond à votre question!

Utilisez le redirection après post ou parfois appelé PRG (post / redirect / get)

En bref, lorsque les messages de l'utilisateur sous la forme, vous effectuez une redirection côté client (après avoir consommé les données post) à la page de réponse (succès).

Un exemple concret de la vie serait cette réponse affichée deux fois ;-). Si vous ne voulez pas compter, vous pouvez calculer un hachage MD5 des données fournies, le cas échéant en ajoutant des informations telles que l'adresse IP source et le navigateur utilisé sur tous les aspects du côté client (javascript, ou même les cookies), et rejeter les messages qui ont le même hachage.

Si la forme a l'intention de fournir une interface pour l'enregistrement des données dans dbms serveur, vous pouvez utiliser le champ de révision spéciale qui est obligatoire pour les données soumises. Une vérification de ce qu'il faut faire ou non les matches de révision soumis que de la dernière version des données dans la base de données (ou est celle d'une nouvelle donnée à insérer), pourrait vous fournir un bon contrôle si plusieurs soumet sont faits en séquence.

Utilisation de cadre application web, nous pouvons comme suit gérer ce problème:

Struts dispose de 3 méthodes utiliser pour le token, saveToken(), isTokenValid() and resetToken().

saveToken() - générer la clé jeton et enregistrer sur demande attribut / session de
. isTokenValid() - validate soumis clé jeton contre le 1 magasin à la demande / séance
.  resetToken() - réinitialiser la clé du jeton.

Comment ça marche: 1) Lors du chargement de la forme, invoque saveToken() sur la classe d'action pour créer et stocker la clé du jeton. Struts stockeront la clé générée à la demande / session. Si le jeton créé avec succès, lorsque la source de vue sur le navigateur, vous verrez quelque chose de similaire à ce qui suit, la clé de jeton est stockée comme champ caché:

<form action="myaction.do" method="post"> 
 <input type="hidden" 
 name="<%= Constants.TOKEN_KEY %>" 
 value="<%= session.getAttribute(Action.TRANSACTION_TOKEN_KEY) %>" > 

2) Une fois le formulaire soumis, invoque isTokenValid() sur la classe d'action, il validera la clé jeton soumis (champ caché) avec la clé jeton précédemment stockée sur demande / session. Si correspondance, il retourne vrai.

public final ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
    saveToken(request);
    if (!tokenIsValid(request)) {
        //forward to error page saying "your transaction is already being processed" 
    } else {
        //process action 
        //forward to jsp 
    }
    // Reset token after transaction success. 
    resetToken(request);
}

référence

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top