2010-12-01 7 views
31

Tengo un formulario de envío a través de POST. Presento el formulario, y todo está bien; sin embargo, si intento volver a cargar la página nueva a la que va el formulario después del envío, aparece el mensaje "¿Desea volver a enviar datos?" (FireFox). También podría suceder en otros navegadores, pero no estoy seguro.Detener navegadores solicitando volver a enviar los datos del formulario en la actualización?

¿Alguien sabe de una forma de detener este mensaje apareciendo para que pueda continuar y actualizar la página. No es bueno para entornos de producción: ¡los usuarios pueden enviar el mismo formulario dos veces!

+0

Puede ser que haya entendido mal la pregunta. ¿Estás preguntando cómo desarrollar tal forma? –

+0

Ya no necesita el patrón 'post/redirect/get'. Consulte [esta respuesta] (https://stackoverflow.com/a/47247434/4632019) –

+0

Posible duplicado de [Cómo evitar que se vuelva a enviar el formulario cuando la página se actualiza (F5/CTRL + R)] (https://stackoverflow.com/questions/6320113/how-to-prevent-form-resubmission-when-page-is-refreshed-f5-ctrlr) –

Respuesta

43

Debe utilizar el patrón POST-Redirect-GET.

Haga que su formulario responda con un redireccionamiento a una solicitud GET.
De esta manera, cuando el usuario actualiza la página, solo volverá a enviar el GET.

+9

Explicación completa: http://www.theserverside.com/news/1365146/Redirect- AfterPost – robertc

+0

Por ejemplo, OrderSubmit vuelve con un redirecto 403 a OrderConfirmationView. Que cuando un usuario acierta a actualizar (o envía el enlace a un amigo, o lo marca con un marcador, etc.), solo refrescan la vista, no la acción. –

+2

@Michael: Quiere decir un 302. – SLaks

1

Será una violación de seguridad si los navegadores hacen eso. Por ejemplo, en el procesamiento de tarjetas de crédito, el sitio puede cobrarle al usuario dos veces.

El único camino es ir a la barra de direcciones y presionar enter. Causará una nueva solicitud.

+2

Es por eso que el usuario está tratando de descubrir cómo prevenirlo; no quieren que el formulario se presente dos veces. – Vreality

8

Una manera fácil response.sendRedirect después se vuelve a cargar la página de esta manera:

window.location.href = window.location.pathname; 

Funciona para mí.

+0

¿Podría explicar y dar más detalles? –

+0

@Damir: en lugar de "recargar", esto es como ir a una página nueva, excepto que es la misma página. Como si hicieras clic en un enlace que te enviará a la misma página en la que ya estás conectado. – Anthony

+0

Esto me solucionó el problema. – EJoshuaS

1

Si el URL no tiene ningún parámetro, utilice este -

window.location = window.location.href+"?rnd="+Math.random(); 

O bien utilizar este -

window.location = window.location.href+"&rnd="+Math.random(); 

Se trabajará.

+1

Esta es una solución muy fea. Agregar números aleatorios al final de una solicitud POST es probablemente la peor forma de resolver el problema original – Bojangles

+1

@Bojangles - ¿Puedes aclarar los inconvenientes? – Ashwin

+2

@Bojangles: incluso JQuery usa esta técnica (la usan dentro de su "caché" -Opción dentro de $ .ajax() - Llamadas, para evitar que el Ajax-Target-URL se almacene en caché). Entonces, no creo que sea lo "peor" que hacer. Funciona y funciona como se esperaba. ¡Entonces creo que es una solución buena y fácil para el problema! –

Cuestiones relacionadas