2010-02-24 19 views
17

¿Cuál es la mejor manera de evitar el envío de formularios duplicados en Spring. ¿Este marco proporciona alguna característica especial para manejar este problema (por ejemplo, como Synchronizer Token en Struts)?Envío de formulario duplicado en Spring

+1

Esto no es específico para cualquier marco, pero puede evitar envíos duplicados con jQuery. http://stackoverflow.com/questions/2830542/prevent-double-submission-of-forms-in-jquery/4473801#4473801 –

Respuesta

35

Hay diferentes maneras de evitar dobles alega, que se pueden combinar:

  1. Uso JavaScript para disable el botón unos pocos ms después del clic. Esto evitará que múltiples envíos sean causados ​​por usuarios impacientes que hagan clic varias veces en el botón.

  2. Enviar una redirección después del envío, esto se conoce como Post-Redirect-Get (PRG) pattern. Esto evitará que múltiples envíos sean causados ​​por usuarios presionando F5 en la página de resultados e ignorando el navegador advirtiendo que los datos serán reenviados, o navegando hacia adelante y hacia atrás por los botones de navegación hacia atrás/adelante e ignorando la misma advertencia.

  3. Genera un token único cuando se solicita la página y se coloca tanto en el ámbito de sesión como en el campo oculto del formulario. Durante el procesamiento, verifique si el token está allí y luego quítelo inmediatamente de la sesión y continúe con el procesamiento. Si el token no está allí, entonces bloquea el procesamiento. Esto evitará los tipos de problemas antes mencionados.

En primavera se puede utilizar como RedirectView aplicación del patrón PRG (como se describe en el punto 2). Los otros dos puntos deben implementarse usted mismo.

+0

Hola, he aplicado el patrón PRG. funciona bien. pero necesito pasar un mensaje al método Get como "ID de usuario 1001 creado con éxito". para eso tengo una variable de nivel de clase de controlador que establecerá su valor en el método de publicación y lo obtendrá en el método GET. Esto creará un problema para el usuario concurrente. ¿Cómo puedo evitar este problema? –

+0

@Dhrumil: almacénelo en la sesión o una cookie en su lugar. – BalusC

+0

no es necesario un poco más de tiempo de procesamiento ... en lugar de nuestro marco de codificación manual debe proporcionar alguna característica como Tokens que Struts2.0 proporciona por defecto. –

4

Simplemente haga una redirección después de la publicación. Una vez que se haya enviado correctamente un formulario, cuando devuelva su ModelAndView asegúrese de que View es un RedirectView. Desde el POV del usuario, envían el formulario y luego se redirigen para hacer un "GET" a otra URL. De esta forma, no enviarán dos veces.

Tenga en cuenta que al utilizar una vista de redireccionamiento, los atributos del modelo quedan expuestos en la URL como parámetros. Por lo que es posible que desee mantener los atributos lo más delgados posible. Lo que normalmente hago es mostrarle al usuario una página que realmente no contiene ninguna información única, solo un mensaje de "confirmación".

Cuestiones relacionadas