browser - varios - ¿Cómo evito que los botones Atrás y Actualizar vuelvan a enviar mi formulario?
remove autocomplete input chrome (13)
Estoy haciendo desarrollo web.
Tengo una página para hacer con la tarjeta de crédito, que cuando el usuario hace clic en "actualizar" o "Atrás", la transacción se realizará una vez más, lo que no es deseado.
Esto incluye el navegador arriba a la izquierda "Atrás" y el botón "Actualizar", "clic derecho-> Actualizar / Atrás", presione la tecla "F5". Esto se debe hacer en cierta página de CGI solamente, no en todas.
¿Se puede hacer esto usando Javascript? O cualquier otro método?
generar una cadena aleatoria y almacenarla en sesión,
luego déjalo en tu forma como un valor oculto,
compruebe la variable enviada y almacenada, si las coincidencias procesan su solicitud,
ir a 1.
Coloque este código en la página del formulario
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.Now-new TimeSpan(1,0,0));
Response.Cache.SetLastModified(DateTime.Now);
Response.Cache.SetAllowResponseInBrowserHistory(false);
El simple hecho de que volver a enviar el formulario genera una transacción duplicada es preocupante. Debe tener algún tipo de control para asegurarse de que cada envío de datos de formulario sea único.
Por ejemplo, la página que enviaría el formulario debería recibir un ID único que se envía junto con el formulario. La lógica de negocio debería poder reconocer que el formulario enviado ya se ha procesado (ya que el ID (ya no será único) será el mismo), por lo que se ignora el segundo intento.
La ''forma estándar'' todavía no impide que los clientes hagan clic en el botón Atrás dos veces ... o incluso regresen y vuelvan a enviar el formulario si no piensan (por alguna razón) que se ha procesado.
Encontré el mensaje anterior / Redirect / Get Explanations un poco ambiguo
Esto es lo que seguí y espero que ayude a alguien en el futuro
http://wordsideasandthings.blogspot.ca/2013/04/post-redirect-get-pattern-in-php.html
Esencialmente, el proceso basado en la solución anterior es:
- Enviar desde la página de FORMULARIO a la página de procesamiento (o a sí misma)
- Manejar la base de datos o el procesamiento de pagos, etc.
- Si es necesario, almacene el mensaje de comentarios del usuario en una variable de sesión, posibles mensajes de error, etc.
- Realice el redireccionamiento del encabezado a la página de resultados (o a la página de formulario original). Si es necesario, muestre un mensaje personalizado desde la página de procesamiento. Tales como "Error al rechazar el pago con tarjeta de crédito" y restablecer las variables de sesión.
Redirigir con algo como:
header("HTTP/1.1 303 See Other");
header("Location: http://$_SERVER[HTTP_HOST]/yourfilehere.php");
die();
La redirección del encabezado iniciará una solicitud GET
en "yourfilehere.php", porque una redirección es simplemente eso, una "solicitud" para obtener datos del servidor, NO una POST
que envía datos AL servidor. Por lo tanto, el redireccionamiento / GET
evita que se produzca cualquier otro procesamiento de DB / pagos después de una actualización. El estado de error 301
ayudará con presionar el botón Atrás.
Lectura útil:
- http://en.wikipedia.org/wiki/URL_redirection#HTTP_status_codes_3xx
- http://www.theserverside.com/news/1365146/Redirect-After-Post
- http://wordsideasandthings.blogspot.ca/2013/04/post-redirect-get-pattern-in-php.html
- https://en.wikipedia.org/wiki/HTTP#Request_methods
- http://en.wikipedia.org/wiki/Post/Redirect/Get
Este código funciona para no volver desde la página actual me ..
Aquí pongo un código que te ayuda, no abre el menú contextual y en la recarga del navegador te pido que dejes una página o no ...
Estoy intentando hacer clic en el botón Atrás del navegador
jQuery( document ).ready(function() {
document.onkeydown = fkey;
document.onkeypress = fkey
document.onkeyup = fkey;
var wasPressed = false;
function fkey(e){
e = e || window.event;
//alert(e.keyCode);
if( wasPressed ) return;
if (e.keyCode == 116 || e.keyCode == 8 || e.keyCode == 17) {
// alert("f5 pressed");
window.onbeforeunload = null;
return true;
}
}
window.onbeforeunload = function (event) {
var message = ''''; // Type message here
if (typeof event == ''undefined'') {
event = window.event;
}
if (event) {
event.returnValue = message;
}
return message;
};
jQuery(function () {
jQuery("a").click(function () {
window.onbeforeunload = null;
});
jQuery(".btn").click(function () {
window.onbeforeunload = null;
});
//Disable part of page
$(document).on("contextmenu",function(e){
return false;
});
});});
Gracias,
Esto rompe el modelo básico de experiencia de usuario del navegador ... los usuarios siempre deben poder usar los botones Actualizar y Atrás en su navegador. Recomienda que arregle su página de otra manera.
Si actualiza su pregunta para incluir el idioma / plataforma / tecnología del servidor que está utilizando, entonces alguien podría sugerir una solución.
La forma estándar es hacerlo en 3 pasos.
- la página del formulario envía los campos a la página de procesamiento
- la página de procesamiento procesa datos y redirige a la página de resultados
- La página de resultados solo muestra los resultados, volver a cargarla no hará ningún daño.
La mejor manera es tener suficiente lógica de manejo de sesión que pueda reconocer el segundo intento (y posterior) ya que "esto es solo una nueva presentación" e ignorarlo.
La solución de vartec: s resuelve el problema de recarga, no el problema de fondo, por lo que aquí hay una solución para eso:
- La página de formulario establece una variable de sesión, por ejemplo, sesión ("fromformpage") = 1
- La página de procesamiento comprueba la variable de la sesión, si es = "1", luego procesa los datos y redirige a la página de resultados, en caso de que no sea igual a "1", simplemente redirecciona a la página de resultados.
- La página de resultados establece la variable de sesión en "".
Luego, si el usuario está presionando el botón Atrás, la página de procesamiento no volverá a realizar el proceso, solo redirigirá a la página de proceso.
No deberías tratar de "bloquear" estas acciones. Lo que debe hacer es asegurarse de que no ocurra nada cuando alguien "envía dos veces" el formulario.
No vi esto aquí, así que aquí está.
- Pon un token único en el formulario.
- El botón Enviar activa una solicitud xmlhttp (ajax) al servidor para crear una variable de sesión nombrada después del token con un valor almacenado de 1.
- La solicitud ajax envía el formulario después de recibir un cambio de estado positivo.
- El script de procesamiento de formularios verifica la variable de sesión con el valor almacenado de 1.
- El script elimina la variable de sesión y procesa el formulario.
Si no se encuentra la variable de sesión, el formulario no se procesará. Como la variable se elimina tan pronto como se encuentra, el formulario solo se puede ejecutar presionando el botón de enviar. Actualizar y volver no enviará el formulario. Esto funcionará sin el uso de una redirección.
Simplemente ponga este javascript en la sección html de la página aspx arriba de la sección principal
<script type = "text/javascript" >
function disableBackButton()
{
window.history.forward();
}
setTimeout("disableBackButton()", 0);
</script>
Tenemos que ponerlo en la sección html de la página que queremos evitar que el usuario visite presionando el botón Atrás
El código completo de la página se ve así
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<script type = "text/javascript" >
function disableBackButton()
{
window.history.forward();
}
setTimeout("disableBackButton()", 0);
</script>
</head>
<body onload="disableBackButton()">
<form id="form1" runat="server">
<div>
This is First page <br />
<br />
Go to Second page
<br />
<br />
<asp:LinkButton ID="LinkButton1" runat="server"
PostBackUrl="~/Default2.aspx">Go to Second Page
</asp:LinkButton></div>
</form>
</body>
</html>
Si está usando Firefox, use en lugar de onload
Si desea deshabilitar el botón Atrás usando el código detrás de la página aspx, entonces debe escribir el código C # mencionado debajo
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
string strDisAbleBackButton;
strDisAbleBackButton = "<script language="javascript">/n";
strDisAbleBackButton += "window.history.forward(1);/n";
strDisAbleBackButton += "/n</script>";
ClientScript.RegisterClientScriptBlock(this.Page.GetType(), "clientScript", strDisAbleBackButton);
}
También podemos lograr esto al deshabilitar el caché o el caché del navegador al escribir esta línea de código en el evento Page_load o en el evento Page_Init
protected void Page_Init(object Sender, EventArgs e)
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(-1));
Response.Cache.SetNoStore();
}
Al hacer esto, el usuario obtendrá la página que ha expirado el mensaje al presionar el botón Atrás del navegador
Demo es:
y en algunos navegadores ni siquiera puedes hacer eso, ¡y esto es bueno!