Как остановить кнопки Back и Refresh от повторной отправки моей формы?
Я занимаюсь веб-разработкой.
У меня есть страница с кредитной картой, которая, когда пользователь нажимает "обновить" или "Назад", транзакция будет выполняться еще раз, что нежелательно.
Это включает в себя верхнюю левую кнопку браузера "Назад" и "Обновить", "щелкните правой кнопкой мыши- > Обновить/Назад", нажмите клавишу "F5".
Это нужно делать только на определенной странице cgi, но не на всех.
Можно ли это сделать с помощью Javascript? Или любой другой метод?
Ответы
Ответ 1
стандартный способ - сделать это за 3 шага.
- страница формы отправляет поля на страницу обработки
- обработка страницы обрабатывает данные и перенаправляет на страницу результатов
- страница результатов просто отображает результаты, перезагрузка не принесет никакого вреда.
Ответ 2
Это нарушает базовую модель пользовательского интерфейса браузера... пользователи всегда должны иметь возможность использовать кнопки "Обновить" и "Назад" в своем браузере. Рекомендовать, что вы исправляете свою страницу другим способом.
Если вы обновите свой вопрос, чтобы включить язык сервера/платформу/технологию, которые вы используете, тогда кто-то может предложить решение.
Ответ 3
Простой факт, что повторная отправка формы создает дублируемую транзакцию, вызывает беспокойство. У вас должна быть какая-то проверка, чтобы обеспечить уникальность каждого представления данных формы.
Например, странице, которая должна отправить форму, должен быть присвоен уникальный идентификатор, который отправляется вместе с формой. Затем бизнес-логика сможет распознать, что представленная форма уже обработана (поскольку уникальный идентификатор (не более) будет таким же), поэтому игнорирует вторую попытку.
"Стандартный способ" по-прежнему не позволяет клиенту дважды нажать кнопку "Назад"... или даже вернуться и повторно отправить форму, если они не думают (по какой-либо причине), что она была обработана.
Ответ 4
-
создать случайную строку и сохранить ее в сеансе,
-
затем вывести его в вашу форму как скрытое значение,
-
проверить переданную и сохраненную переменную, если совпадения обрабатывают ваш запрос,
-
перейти к 1.
Ответ 5
Поместите этот код на страницу формы
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.Now-new TimeSpan(1,0,0));
Response.Cache.SetLastModified(DateTime.Now);
Response.Cache.SetAllowResponseInBrowserHistory(false);
Ответ 6
Вы не должны пытаться "блокировать" эти действия.
То, что вы должны сделать, это убедиться, что ничего не происходит, когда кто-то "дважды подает" форму.
Ответ 7
и в некоторых браузерах вы даже не можете этого сделать, и это хорошо!
Ответ 8
Лучший способ состоит в том, чтобы иметь достаточную логику обработки сеанса, чтобы вы могли распознать вторую (и далее) попытку как "это просто повторная передача" и игнорировать ее.
Ответ 9
Я не видел этого здесь, так вот.
- Поместите уникальный символ в форму.
- Кнопка отправки запускает запрос xmlhttp (ajax) серверу для создания переменной сеанса с именем после токена с сохраненным значением 1.
- Запрос ajax отправляет форму после получения положительного изменения состояния.
- Обработка формы script проверяет переменную сеанса с сохраненным значением 1.
- script удаляет переменную сеанса и обрабатывает форму.
Если переменная сеанса не найдена, форма не будет обрабатываться. Поскольку переменная удаляется сразу после ее обнаружения, форма может быть запущена только нажатием кнопки отправки. Обновить и обратно не представит форму. Это будет работать без использования перенаправления.
Ответ 10
Решение vartec: s решает проблему перезагрузки, а не обратную проблему, поэтому вот решение для этого:
- Страница формы устанавливает переменную сеанса, например session ( "fromformpage" ) = 1
- Страница обработки проверяет переменную сеанса, если ее = "1", затем обрабатывает данные и перенаправляет на страницу результатов, если есть что-то другое, кроме = "1", а затем просто перенаправляется на страницу результатов.
- Страница результатов устанавливает для переменной сеанса значение "".
Затем, если пользователь нажимает кнопку "Назад", страница обработки не будет выполнять этот процесс еще раз, только перенаправление на страницу процесса.
Ответ 11
Я нашел приведенные выше сообщения/перенаправления/получить объяснения немного неоднозначными
Вот что я последовал и надеюсь, что это поможет кому-то в будущем
http://wordsideasandthings.blogspot.ca/2013/04/post-redirect-get-pattern-in-php.html
По существу, процесс, основанный на вышеуказанном решении:
- Отправьте с страницы FORM на страницу обработки (или для себя)
- Обработка базы данных или обработка платежей и т.д.
- При необходимости сохраните сообщение обратной связи с пользователем в переменной сеанса, возможных сообщениях об ошибках и т.д.
- Выполните перенаправление заголовка заголовка на страницу результатов (или на исходную страницу формы). При необходимости отобразите пользовательское сообщение со страницы обработки. Такие, как "Ошибка кредитной карты был отклонен" и reset переменные сеанса.
Перенаправить с чем-то вроде:
header("HTTP/1.1 303 See Other");
header("Location: http://$_SERVER[HTTP_HOST]/yourfilehere.php");
die();
Перенаправление заголовка инициирует запрос GET
на "yourfilehere.php", потому что перенаправление - это просто "запрос" для извлечения данных с сервера, а не POST
, который передает данные на сервер. Таким образом, перенаправление /GET
предотвращает последующую обработку DB/платежей после обновления. Состояние ошибки 301
поможет при нажатии кнопки "Назад".
Полезное чтение:
Ответ 12
Просто поместите этот javascript в раздел html страницы aspx над головой раздела
<script type = "text/javascript" >
function disableBackButton()
{
window.history.forward();
}
setTimeout("disableBackButton()", 0);
</script>
Нам нужно поместить его в раздел html страницы, который мы хотим запретить посетителю, нажав кнопку "Назад"
Полный код страницы выглядит следующим образом:
<%@ 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>
Если вы используете firefox, используйте вместо onload
Если вы хотите отключить кнопку "Назад", используя код позади страницы aspx, вам нужно написать ниже упомянутый код
С# код за
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);
}
Мы также можем добиться этого, отключив кеширование или кеширование браузера, написав эту строку кода либо в событии Page_load, либо в событии 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();
}
При этом пользователь получит сообщение об истечении срока действия страницы при нажатии кнопки браузера
Демо:
![enter image description here]()
Ответ 13
Этот код работает не для возврата с текущей страницы me..
Здесь я помещаю код, который помогает вам, а не открывать контекстное меню и перезагрузку браузера, просить вас оставить страницу или нет...
Я пытаюсь спросить, нажмите кнопку браузера назад
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;
});
});});
Спасибо,