Résolution de la question de la double soumission

j'aimerais voir comment les développeurs web évitent le double problème de soumission. Donc, fondamentalement, ma compréhension du problème est comme suit:

il y a double soumission lorsqu'un utilisateur impatient soumet un formulaire plusieurs fois, ce qui cause des problèmes. Ce problème peut être résolu par JavaScript (en particulier les scripts jQuery) qui désactive le bouton Soumettre une fois que le formulaire a été soumis - une faiblesse de ceci est si les clients ont Javascript désactivé.

il y a aussi Côté Serveur méthodes de détection.

Donc mes questions sont:

Comment surmonter la double soumission? Quel est l'exemple concret d'un problème causé par double soumet? Existe-t-il des cadres D'Application Web qui intègrent des outils de double soumission?

24
demandé sur Cœur 2011-01-15 14:36:26
la source

7 ответов

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 token doit être généré et conservé en session pour le rendu de la page initiale, lorsque la requête est soumise avec le token pour la première fois , dans l'action struts, lancez un thread avec le nom du thread comme id du token et lancez la logique quelle que soit la requête du client. pour, lorsque le client soumet à nouveau la même requête, vérifiez si le thread est toujours en cours d'exécution(thread.getcurrentthread ().interrompu) si vous êtes encore en cours d'exécution, envoyez un client redirect 503.

voir la ExecuteAndWaitInterceptor de struts 2code, la logique de ceci, combiné avec le jeton de l'aide rapidement et cliquez sur

8
répondu Dead Programmer 2011-01-15 16:01:28
la source

situation réelle: placer des paris sur un site de Paris. Les utilisateurs double-cliquer et obtenir deux paris placés. Pas bon!!! Les vérifications Javascript n'étaient pas suffisantes pour empêcher cela.

Solution:

  1. Créer UUID/ GUID entrée cachée dans la forme en utilisant un langage de script côté serveur qui rend la forme.

  2. sur le formulaire de soumission ajouter immédiatement ceci à une table de base de données appelée UniqueSubmissions (par exemple). Alors procédez au traitement.

  3. chaque requête subséquente avec le même UUID / GUID sera rejetée si elle se trouve dans le UniqueSubmissions tableau.

Cela a fonctionné pour nous. L'espoir qui permet de répondre à votre question!

15
répondu Ciaran Archer 2011-01-16 20:37:05
la source

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

en bref, quand l'utilisateur poste le formulaire, vous effectuez une redirection côté client (après avoir consommé les données post) à la page de réponse (succès).

7
répondu Joel 2011-01-15 15:36:40
la source

un exemple concret serait cette réponse affichée deux fois ;-). Si vous ne voulez pas vous fier au côté client (javascript, ou même cookies), vous pouvez calculer un hachage MD5 des données soumises, éventuellement en ajoutant des informations telles que L'adresse IP source et le navigateur utilisé, et rejeter les messages qui ont le même hachage.

5
répondu Yack 2011-01-15 16:03:51
la source

web2py cadre protection contre une double soumission. 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. Cette méthode aussi protège contre CSRF (demande trans-site falsification).

3
répondu Anthony 2011-02-06 05:47:55
la source

si le formulaire A l'intention de fournir une interface pour enregistrer certaines données dans les SGBD du serveur, vous pouvez utiliser le champ de révision spéciale qui est obligatoire pour les données soumises. Vérifier si la révision soumise correspond ou non à la dernière version des données de la base de données (ou s'il s'agit d'une nouvelle donnée à insérer) pourrait vous donner un bon contrôle de ce qu'il faut faire si plusieurs soumissions sont faites dans l'ordre.

2
répondu Dennis Kreminsky 2011-02-06 12:08:11
la source

en utilisant le framework web-application de struts, nous pouvons traiter ce problème comme suit:

Struts a 3 méthodes d'utilisation pour le token, saveToken(), isTokenValid() and resetToken().

saveToken() - génère la clé token et sauve l'attribut request/session.

isTokenValid() - valider la clé de token soumise par rapport à la 1 mémoire dans request/session.

resetToken() - réinitialiser la clé.

Comment cela fonctionne:

1) lors du chargement de la forme, invoque saveToken() sur la classe action pour créer et stocker la clé token. Struts stockera la clé générée dans request/session. Si le token a été créé avec succès, lorsque vous verrez la source sur le navigateur, vous verrez quelque chose de similaire à ce qui suit, la clé du token est stockée comme un 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() dans la classe action, il validera la clé token soumise(champ caché) avec la clé token stockée précédemment sur request/session. Si le match, il renvoie la valeur true.

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

1
répondu Premraj 2015-08-13 16:17:11
la source