Envío repetido de formularios: no complete una vez, primero solicite la página del formulario -> luego envíe el proceso del formulario para completar el envío de datos
La causa raíz: no hacerlo en su totalidad, primero solicite la página del formulario -> luego envíe el proceso del formulario.
Causa presentaciones repetidas:
Nota: Después de retroceder, actualice la página del formulario y envíe nuevamente. En este momento, en lugar de repetir la presentación, se envía una nueva solicitud. Bajo Firefox, la operación de repetir la sumisión a la misma dirección no es válida.
Caso:
@WebServlet ("/trans") Public Class TransFerServlet extiende httpservlet {private static final long serialVersionUid = 1l; Servicio vacío protegido (httpservletRequest req, httpservletResponse resp) lanza ServletException, ioexception {req.setcharacterEncoding ("UTF-8"); resp.setContentType ("Text/html; charset = utf-8"); PrintWriter out = resp.getwriter (); Cadena de dinero = req.getParameter ("dinero"); // simular retraso de red intenta {horth.sleep (3000); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("Cantidad transferida:"+dinero); out.print ("Monto transferido:"+dinero); }}En el punto loco, encontrará que la página JSP no cambiará, pero puede ver a través de la impresión en segundo plano, y se emitirá continuamente, lo que indica que se está ejecutando todo el tiempo
Solución:
Antes de enviar la garantía, primero debe solicitar la interfaz del formulario. El principio es el mismo que el código de verificación .---- Mecanismo de token
Al solicitar la primera vez, al solicitar la interfaz de formulario, cree un token. Al hacer clic en la transferencia y enviar la solicitud, traiga este token y envíelo a la siguiente interfaz. Verifique el token en el servlet. Este token es uno en la sesión y otro en la forma. La ecualización significa que la forma es correcta, y el token en esta sesión se destruye.
Código en la página JSP
<% // Crear token String token = java.util.uuid.randomuuid (). ToString (); // existe una de las sesión y luego hacer un juicio session.setAttribute ("token_in_session", token); %> <h3> Interfaz de transferencia </h3> <form de acción = "/trans" método = "post"> <input type = "Hidden" name = "token" valor = "<%= token%>"/> cantidad de transferencia: <input type = "text" name = "dinero" min = "1" requerido/> <br/> <input type = "someter" valor = "transferir"/> <</formy> </formy>Código en transferservlet
@WebServlet ("/trans") Public Class TransFerServlet extiende httpservlet {private static final long serialVersionUid = 1l; Servicio vacío protegido (httpservletRequest req, httpservletResponse resp) lanza ServletException, ioexception {req.setcharacterEncoding ("UTF-8"); resp.setContentType ("Text/html; charset = utf-8"); PrintWriter out = resp.getwriter (); // Obtener el valor del token en la cadena de formulario token = req.getParameter ("token"); // Obtenga el valor del token en la sesion String sessionToken = (String) req.getSession (). GetAttribute ("token_in_session"); // El token en la sesión es fácil de estar vacío porque el token en la sesión es un if (token.equals (sessionToken)) {// indica que el token es el mismo req.getSession (). RemoveAttribute ("token_in_session"); Cadena de dinero = req.getParameter ("dinero"); System.out.println ("Cantidad de transferencia:"+dinero); out.print ("Cantidad de transferencia:"+dinero); // Finalmente destruye el token en la sesión} // Si el token es diferente, significa que es una presentación repetida y no se puede enviar}}Luego, para no aparecer en el código Java en el archivo JSP, cree y salte el token en otro servlet
@WebServlet ("/Transfer") Class Public CopyOfTransFerservlet extiende httpservlet {private static final long SerialVersionUid = 1l; Servicio vacío protegido (httpservletRequest req, httpservletResponse resp) lanza ServletException, ioexception {// crea el token y salta para enviar.jsp token de cadena = uuid.randomuuid (). toString (); System.out.println (token); req.getSession (). setAttribute ("token_in_session", token); req.SetAttribute ("Token", Token); req.getRequestDispatcher ("/Views/RepetsubMit/Subt.jsp"). Forward (Req, Res); }}Así es como se ve el archivo JSP ahora
<h3> interfaz de transferencia </h3> <form de acción = "/trans" método = "post"> <input type = "Hidden" name = "token" valor = "$ {token}"/> cantidad de transferencia: <input type = "text" name = "dinero" min = "1" requerido/> <br/> <input type = "someter" valor = "transferir"/> </form>Es mucho más limpio que lo anterior y más ordenado, pero aún no se siente bien, porque si necesita usarlo en otros lugares, necesita crear fichas, verificar tokens y eliminar tokens, para extraerlo para hacer una clase de herramientas
Tokenutil.java
// Clase de herramienta de token // Crear token // Verifique token // destruye la clase pública de token tokenutil {string static final privado token_in_session = "token_in_session"; 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 ValidateTeToken (httpservletrequest req, string tokenInRequest) {// Obtener el valor de token en el sesionstring sessionToken = (string) req.getSession (). getAttribute (token_in_session); if (tokeninRequest.equals (sessionToken)) {req.getSession (). RemoveAttribute (token_in_session); devolver verdadero; } return false; }}Esto está bien. El usuario solo necesita llamar a esta clase de herramientas, y no es necesario escribir una serie de operaciones, como crear un token.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.