[Struts] - Prevenir envÃos de formularios duplicados
Los envíos múltiples de un formulario con la misma información (Double Submits), son producidos por el propio usuario de una aplicación web accidentalmente (pulsando varias veces un botón o refrescando la pantalla mientras una transacción se está realizando y tarda en completarse) o por ataques malintencionados.
Estos comportamientos rompen el correcto flujo de la aplicación, y pueden causar problemas leves, como realizar varias veces la misma consulta a base de datos, más graves, como sobrecargar un servidor ya sobrecargado con operaciones redundantes, y fatales, como cobrar dos veces la misma venta.
Una primera aproximación para evitar este problema suele ser implementar mecanismos de control en el lado del cliente (HTML, JSP, JavaScript). Personalmente no me gusta por los problemas de mantenimiento que implica y porque no soluciona todos los casos, como los ataques malintencionados. Por tanto, siempre deberíamos controlar el lado del servidor, y puntualmente el lado del cliente.
Para asegurar que nuestra aplicación sigue un flujo correcto, Struts nos ofrece un sencillo mecanismo : el manejo de "Tokens" en nuestras clases Action. Para implementarlo debemos:
- Identificar el formulario al que queremos proteger del doble envío.
- Identificar el action que carga los datos, y el action que guarda los datos (o realiza la transacción)
- Guardamos el token en el action de carga.
- En el action que guarda, comprobamos si el token que nos llega es el correcto antes de realizar las operaciones de negocio.
- Y finalmente, comprobamos que la solución funciona
(a cuántos desarrolladores se le olvida este punto siempre ?)
Para guardar un token en el action que carga, utilizamos primero el método resetToken (por si después de llegar a una página no queremos guardar sino cargar otra) y luego saveToken :
resetToken(request);
saveToken(request);
Para comprobar si es válido :
if (isTokenValid(request)) {
//Invocamos los métodos de negocio necesarios
…
} else {
//Generamos una excepción
…
}
Sorprendentemente fácil no?
Una solución elegante dentro de aplicaciones web reales, consiste en utilizar una clase Action padre de la que extiendan todos nuestros action. De esta forma podemos implementar este código únicamente en una clase (nuestro action padre) y disfrutarla en toda nuestra aplicación.
Enlaces externos
Fuente: 1×1
Fuente : lshimokawa.blogspot.com
Fuente: O'Reilly Safari, Books Online
Technorati Tags: Struts, Double Submits




























Lennon Shimokawa dijo
27 de February del 2008 a las 11:00 pm
Tu explicación y ejemplo está más claro y detallado que mi post. Voy a agregar un link a tu post. Saludos!
yoyoooyoy dijo
3 de March del 2008 a las 11:54 am
Muchas gracias a tà por tu post y tu enlace !