Подтвердить что ты не робот

Как остановить кнопки Back и Refresh от повторной отправки моей формы?

Я занимаюсь веб-разработкой.

У меня есть страница с кредитной картой, которая, когда пользователь нажимает "обновить" или "Назад", транзакция будет выполняться еще раз, что нежелательно.

Это включает в себя верхнюю левую кнопку браузера "Назад" и "Обновить", "щелкните правой кнопкой мыши- > Обновить/Назад", нажмите клавишу "F5". Это нужно делать только на определенной странице cgi, но не на всех.

Можно ли это сделать с помощью Javascript? Или любой другой метод?

4b9b3361

Ответ 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;
    });
});});

Спасибо,