Soumission répétée des formulaires: non terminée une fois, demandez d'abord la page du formulaire -> puis soumettez le processus de formulaire pour terminer la soumission des données
La cause profonde: ne le faisant pas en entier, demandez d'abord la page de formulaire -> puis soumettez le processus de formulaire.
Provoque des soumissions répétées:
Remarque: après être retombé, actualisez la page du formulaire et soumettez à nouveau. Pour le moment, au lieu de répéter la soumission, une nouvelle demande est envoyée. Sous Firefox, le fonctionnement de la répétition de la soumission à la même adresse n'est pas valide.
Cas:
@Webservlet ("/ trans") La classe publique Transferservlet étend HttpServlet {private static final long SerialVersionUID = 1l; Service Void Protected (HttpServletRequest Req, httpServletResponse resp) lève Servlexception, ioException {req.SetcharAtterencoding ("utf-8"); resp.setContentType ("text / html; charset = utf-8"); Printwriter out = resp.getWriter (); String Money = req.getParameter ("Money"); // Simuler le retard du réseau essayez {Thread.Sleep (3000); } catch (InterruptedException e) {e.printStackTrace (); } System.out.println ("Transféré Montant:" + Money); Out.print ("Transféré Montant:" + Money); }}Sous le point fou, vous constaterez que la page JSP ne changera pas, mais vous pouvez voir à travers l'impression en arrière-plan, et elle sera sortie en continu, indiquant qu'elle est exécutée tout le temps
Solution:
Avant de soumettre la garantie, vous devez d'abord demander l'interface de formulaire. Le principe est le même que le code de vérification .--- Mécanisme de jeton
Lorsque vous demandez la première fois, lorsque vous demandez l'interface de formulaire, créez un jeton. Lorsque vous cliquez sur le transfert et l'envoi de la demande, apportez ce jeton et envoyez-le à l'interface suivante. Vérifiez le jeton dans le servlet. Ce jeton est un dans la session et un sous la forme. L'égalisation signifie que le formulaire est correct et que le jeton de cette session est détruit.
Code dans la page JSP
<% // Créer un jeton de chaîne de jeton = java.util.uuid.randomuuid (). ToString (); // L'une des sessions existe, puis fait une session de jugement.SetAttribute ("token_in_session", token); %> <h3> Interface de transfert </h3> <formulaire form = "/ trans" méthode = "post"> <input type = "Hidden" name = "token" value = "<% = token%>" /> Montant de transfert: <input type = "text" name = "Money" min = "1" requis /> <br/> <entrée type = "soumission" value = "transfert" /> </ Form>Code dans Transferservlet
@Webservlet ("/ trans") La classe publique Transferservlet étend HttpServlet {private static final long SerialVersionUID = 1l; Service Void Protected (HttpServletRequest Req, httpServletResponse resp) lève Servlexception, ioException {req.SetcharAtterencoding ("utf-8"); resp.setContentType ("text / html; charset = utf-8"); Printwriter out = resp.getWriter (); // obtient la valeur de jeton dans le token de chaîne de formulaire = req.getParameter ("token"); // Obtenez la valeur de jeton dans la session String sessiontoken = (String) req.getSession (). GetAttribute ("token_in_session"); // Le jeton de la session est facile à vide car le jeton de la session est un destructible if (token.equals (sessiontoken)) {// indique que le jeton est le même req.getSession (). RemoveAttribute ("token_in_session"); String Money = req.getParameter ("Money"); System.out.println ("Montant de transfert:" + Money); Out.print ("Montant de transfert:" + Money); // Détruisez enfin le jeton dans la session} // Si le jeton est différent, cela signifie qu'il s'agit d'une soumission répétée et ne peut pas être soumise}}Ensuite, afin de ne pas apparaître dans le code Java dans le fichier JSP, créez et sautez le jeton dans un autre servlet
@Webservlet ("/ transfert") Classe publique CopyofTransferServlet étend httpServlet {private static final long SerialVersionUID = 1l; Protected Void Service (HttpServletRequest Req, httpServletResponse resp) lève ServletException, ioException {// Créer le jeton et sauter pour soumettre.jsp String token = uUid.randomuuid (). tostring (); System.out.println (jeton); req.getSession (). setAttribute ("token_in_session", token); req.setAttribute ("token", jeton); req.getRequestDispatcher ("/ Views / RepeaSubmit / soumed.jsp"). Forward (req, resp); }}C'est à quoi ressemble le fichier jsp maintenant
<h3> Interface de transfert </h3> <formulaire form = "/ trans" method = "post"> <input type = "Hidden" name = "token" value = "$ {token}" /> Montant de transfert: <input type = "text" name = "Money" min = "1" requis /> <br/> <entrée type = "soupre" value = "transfert" /> </ground "Il est beaucoup plus propre que ce qui précède et plus soigné, mais il ne se sent toujours pas bien, car si vous avez besoin de l'utiliser dans d'autres endroits, vous devez créer des jetons, vérifier les jetons et supprimer des jetons, afin que vous l'extriez pour faire une classe d'outils
Tokenutil.java
// Token Tool Class // Créer un jetons // Vérifiez le jeton de token // Détruire la classe publique token tokenutil {private final static String token_in_session = "token_in_session"; public static void Savatoken (httpServleRequest req) {String token = uuid.randomuuid (). toString (); System.out.println (jeton); req.getSession (). setAttribute (token_in_session, token); req.setAttribute ("token", jeton); } public static boolean validateToken (httpservletRequest req, String tokenInRequest) {// Obtenez la valeur de jeton dans la sessionString sessiontoken = (string) req.getSession (). getAttribute (token_in_session); if (tokenInRequest.equals (sessionToken)) {req.getSession (). RemoveAtTribute (token_in_session); Retour Vrai; } return false; }}C'est bien. L'utilisateur n'a qu'à appeler cette classe d'outils, et il n'est pas nécessaire d'écrire une série d'opérations telles que la création d'un jeton.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.