Wiederholte Einreichung von Formularen: Anfordern Sie zuerst die Formularseite -> Anfordern Sie dann den Formularvorgang, um die Datenübermittlung abzuschließen
Die Root -Ursache: Wenn Sie dies nicht vollständig tun, fordern Sie zuerst die Formularseite an -> dann den Formularprozess ein.
Verursacht wiederholte Einsendungen:
HINWEIS: Nach dem Rückfallen aktualisieren Sie die Formularseite und senden Sie erneut. Zu diesem Zeitpunkt wird eine neue Anfrage gesendet, anstatt die Einreichung zu wiederholen. Unter Firefox ist die Operation der Wiederholung der Einreichung in dieselbe Adresse ungültig.
Fall:
@WebServlet ("/trans") öffentliche Klasse TransferServlet erweitert httpServlet {private statische endgültige long serialversionuid = 1l; Protected void Service (httpServletRequest req, httpServletResponse resp) löst ServletException aus, ioException {req.setcharactercoding ("utf-8"); resp.setContentType ("text/html; charSet = utf-8"); Printwriter out = resp.getWriter (); String Money = req.getParameter ("Geld"); // Simulation der Netzwerkverzögerung versuchen {Thread.sleep (3000); } catch (interruptedException e) {e.printstacktrace (); } System.out.println ("übertragene Betrag:"+Geld); out.print ("überwiesener Betrag:"+Geld); }}Unter dem verrückten Punkt werden Sie feststellen, dass sich die JSP -Seite nicht ändert, aber Sie können den Ausdruck im Hintergrund durchsehen, und sie wird kontinuierlich ausgegeben, was darauf hinweist, dass er ständig ausgeführt wird
Lösung:
Vor der Übermittlung der Garantie müssen Sie zunächst die Formularschnittstelle anfordern. Das Prinzip entspricht dem Verifizierungscode.
Wenn Sie das erste Mal anfordern, erstellen Sie beim Anfordern der Formularschnittstelle ein Token. Wenn Sie auf Übertragung klicken und die Anfrage senden, bringen Sie dieses Token mit und senden Sie sie an die nächste Schnittstelle. Überprüfen Sie das Token im Servlet. Dieses Token ist eins in der Sitzung und eines in der Form. Ausgleich bedeutet, dass die Form korrekt ist und das Token in dieser Sitzung zerstört wird.
Code in JSP -Seite
<% // token String token = java.util.uuid.randomuuid (). ToString () erstellen; // Eine der Sitzungen existiert und dann eine Urteilssitzung. %> <h3> Übertragungsschnittstelle </H3> <Formapion = "/trans" method = "post"> <Eingabe type = "Hidden" name = "token" value = "<%= token%>"/> Übertragungsbetrag: <Eingabe type = "text" name = "min =" 1 "Erforderlich/> <br/> <Eingabe Typ =" value ".
Code im TransferServlet
@WebServlet ("/trans") öffentliche Klasse TransferServlet erweitert httpServlet {private statische endgültige long serialversionuid = 1l; Protected void Service (httpServletRequest req, httpServletResponse resp) löst ServletException aus, ioException {req.setcharactercoding ("utf-8"); resp.setContentType ("text/html; charSet = utf-8"); Printwriter out = resp.getWriter (); // den Token -Wert im Formular String token = req.getParameter ("Token") erhalten; // den Token -Wert in der Sitzungsstring -String -SessionToken = (String) req.getSession (). GetAtTribute ("token_in_in_Session") erhalten; // Das Token in der Sitzung ist leicht leer zu sein, da das Token in der Sitzung ein zerstörbar ist, wenn (token.equals (sessionToken)) {// angibt, dass das Token der gleiche Req.getSession (). String Money = req.getParameter ("Geld"); System.out.println ("Betrag überweisen:"+Geld); out.print ("Betrag überweisen:"+Geld); // Zerstöre schließlich das Token in der Sitzung} // Wenn das Token anders ist, bedeutet es, dass es sich um eine wiederholte Einreichung handelt und nicht eingereicht werden kann}}}Erstellen und springen
@WebServlet ("/transfer") öffentliche Klasse CopyOfTransFerServlet erweitert httpServlet {private statische endgültige long serialversionuid = 1l; Protected void Service (httpServletRequest req, httpServletResponse resp) löst ServletException aus, ioException {// Erstellen Sie den Token und springen Sie zu approyd.jsp String token = uUid.randomuuid (). toString (); System.out.println (Token); req.getSession (). setAttribute ("token_in_insion", token); req.setattribute ("token", token); req.getRequestDispatcher ("/views/repepSubmit/submit.jsp"). Vorwärts (req, resp); }}So sieht die JSP -Datei jetzt aus
<h3> Übertragungsschnittstelle </H3> <Formion action = "/trans" methode = "post"> <Eingabe type = "Hidden" name = "token" value = "$ {token}"/> Übertragungsbetrag: <Eingabe type = "text" name = "min =" 1 "erforderlich/> <BR/> <Eingabe type =" value = "/> </> </> </> </> </> </> </> </> </> </> </</1/> </> </>Es ist viel sauberer als das oben genannte und ordentlicher, aber es fühlt sich immer noch nicht gut an, denn wenn Sie es an anderen Stellen verwenden müssen, müssen Sie Token erstellen, Token verifizieren und Token löschen
Tokenutil.java
// Token -Tool -Klasse // Token erstellen // Token // Token -Token -Klassen -Tokenutil zerstören {private endgültige statische String -Token_in_in_Session = "token_in_insion"; public static void Savatoken (httpServletRequest req) {String token = uUid.randomuuid (). toString (); System.out.println (Token); req.getSession (). setAttribute (token_in_session, token); req.setattribute ("token", token); } public static boolean validateteoken (httpServletRequest req, String tokeninRequest) {// den Token -Wert in der Sitzung SessionString SessionToken = (String) req.getSession (). GetatTribute (token_in_insion); if (tokeninRequest.equals (sessionToken)) {req.getSession (). removeTtribute (token_in_session); zurückkehren; } return false; }}Das ist in Ordnung. Der Benutzer muss nur diese Tool -Klasse aufrufen, und es müssen keine Reihe von Vorgängen wie das Erstellen eines Tokens schreiben.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.