Pure Java/JSF mise en œuvre de double soumettre à la prévention
Nous sommes en utilisant JSF 2.0 sur WebSphere v8.5 avec plusieurs bibliothèques de composants PrimeFaces 4.0, Tomahawk 2.0, RichFaces, etc.
Je suis à la recherche d'mécanisme générique pour éviter formulaire de soumission lorsque la page est actualisée, ou lorsque le bouton envoyer est cliqué une fois de plus. J'ai beaucoup de demandes auprès de différents scénarios.
Pour l'instant j'ai pensé à désactiver le bouton avec un morceau de code JavaScript dans onclick
attribut, mais ce n'est pas satisfaisant. Je suis à la recherche d'un pur Java mise en œuvre à cette fin, quelque chose comme le Struts2 <s:token>
.
Ne Ajax venir plus la forme de re-présentation de la question? seule une partie de la page est affichée, pas toute la page ou la redirection
La désactivation de l'événement onClick ne sera probablement pas sufissiant un delay timer est nécessaire de faire le tour
Oui @NassimMOUALEK-je parvenir à la désactivation de la touche jusqu'à ce que ajax complète son rendu
ses pas exactement le problème que je pensais, lorsque l'utilisateur clique plusieurs fois, et à très vite sur le bouton, attendre un moment avant de soumettre est nécessaire pour décider si vous devez soumettre ou non
Droit, mais je crois que la page web JS est beaucoup plus rapide que l'homme (en cliquant à nouveau, et encore). tout d'abord onclick est de désactiver le bouton que l'ajax va activer ce bouton quand il termine son cycle. Ainsi, par cette pas de chevauchement de l'événement va se produire
La désactivation de l'événement onClick ne sera probablement pas sufissiant un delay timer est nécessaire de faire le tour
Oui @NassimMOUALEK-je parvenir à la désactivation de la touche jusqu'à ce que ajax complète son rendu
ses pas exactement le problème que je pensais, lorsque l'utilisateur clique plusieurs fois, et à très vite sur le bouton, attendre un moment avant de soumettre est nécessaire pour décider si vous devez soumettre ou non
Droit, mais je crois que la page web JS est beaucoup plus rapide que l'homme (en cliquant à nouveau, et encore). tout d'abord onclick est de désactiver le bouton que l'ajax va activer ce bouton quand il termine son cycle. Ainsi, par cette pas de chevauchement de l'événement va se produire
OriginalL'auteur Sarz | 2014-04-25
Vous devez vous connecter pour publier un commentaire.
Pour qu'il y a au moins 2 solutions qui ne peuvent pas être combinées:
Effectuer une redirection après synchrone post. De cette façon, l'actualisation serait ré-exécuter seulement la redirection de la requête GET au lieu de la demande initiale. Inconvénient: vous ne pouvez pas faire usage de la demande portée plus à fournir de la rétroaction à l'utilisateur final. JSF 2.0 a résolu ce problème en proposant la nouvelle flash portée. Voir aussi Comment afficher les visages message dans la redirection de la page.
Effectuer le POST de manière asynchrone dans le fond (à l'aide d'ajax). De cette façon, l'actualisation serait ré-exécuter seulement la première requête GET qui a ouvert le formulaire. Vous avez seulement besoin de s'assurer que ces formes sont d'abord ouvert par une requête GET, c'est a dire que vous ne devez jamais effectuer de la page-à-page de navigation par POST (qui en est à son propre déjà une mauvaise conception de toute façon). Voir aussi Quand dois-je utiliser h:outputLink au lieu de h:commandLink?
Pour que fondamentalement, il y a aussi au moins 2 solutions, qui pourraient, si nécessaire, être combinées:
Juste bloquer l'utilisateur final d'être en mesure d'appuyer sur le bouton "soumettre" au cours de la soumettre et/ou après le succès de l'envoyer. Il existe différentes façons, selon le béton fonctionnelles et les exigences de conception. Vous pouvez utiliser JavaScript pour désactiver le bouton soumettre. Vous pouvez utiliser JSF est
disabled
ourendered
attributs pour les désactiver ou masquer le bouton soumettre. Voir aussi Comment faire, double-cliquez sur la prévention de JSF 2. Vous pouvez également utiliser une fenêtre superposée au cours du traitement des requêtes ajax pour bloquer toute interaction de l'utilisateur final. PrimeFaces a<p:blockUI>
pour le but.Valider l'unicité de la nouvelle entité dans le côté serveur. C'est de façon beaucoup plus robuste si vous voulez absolument éviter les doubles emplois, pour des raisons techniques, plutôt que pour des raisons fonctionnelles. C'est assez simple: mettre un
UNIQUE
contrainte sur la DB de la colonne en question. Si cette contrainte est violée, puis la DB (base de données et d'interaction cadre comme JPA) va lancer une violation de contrainte d'exception. Ce qui est le mieux à faire en combinaison avec une mesure JSF validateur qui valide l'entrée à l'avance par l'exécution d'uneSELECT
exactement sur cette colonne et de vérifier si aucun enregistrement n'est retourné. Un JSF validateur permet d'afficher le problème dans la saveur de l'un des visages amicaux message. Voir aussi, entre autres Valider le format de courrier électronique et de l'unicité contre DB.je suis à l'aide de
<f:ajax />
dans toutes les formes de mes applications, ceFlashScope
chose dit àredirect/reload
page. Comment puis-je remédier à cette situation?Il y a un exemple dans "Voir aussi".
La validation de l'unicité dans le côté serveur peut être complexes. Par exemple, j'envoie un sms à mon ami. Dans ce cas, il n'y a pas de logique ou de contrainte pour vérifier l'unicité. Peut-être, la mise en cache et l'appariement de la demande pourrait vous donner un indice, mais même si l'on ignore le coût correspondant, il pourrait y avoir des situations où les demandes avec les mêmes valeurs fait partie de la norme.
OriginalL'auteur BalusC
Au lieu de créer un jeton manuellement, vous pouvez utiliser BalusC solution. Il a proposé un Poste-Réacheminement-GET modèle dans son blog
Des solutions alternatives peuvent être trouvées dans ces réponses:
Cela a déjà été rejeté par la hausse de la gestion de la
Le problème est que nous avons besoin d'une double soumission d'activer et de désactiver selon notre scénario.
OriginalL'auteur Manuel