Как остановить кнопки «Назад» и «Обновить» от повторной отправки формы? - PullRequest
22 голосов
/ 20 марта 2009

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

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

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

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

Ответы [ 13 ]

48 голосов
/ 20 марта 2009

Стандартный способ состоит в том, чтобы сделать это в 3 шага.

  1. страница формы отправляет поля на страницу обработки
  2. страница обработки обрабатывает данные и перенаправляет на страницу результатов
  3. Страница результатов просто отображает результаты, перезагрузка не принесет никакого вреда.
11 голосов
/ 20 марта 2009

Это нарушает базовую модель взаимодействия с браузером ... пользователи всегда должны иметь возможность использовать кнопки «Обновить» и «Назад» в своем браузере. Рекомендую исправить страницу по-другому.

Если вы обновите свой вопрос, включив в него язык / платформу / технологию сервера, которые вы используете, то кто-то может предложить решение.

8 голосов
/ 20 марта 2009

Беспокоит тот простой факт, что повторная отправка формы приводит к дублированию транзакции. У вас должна быть какая-то проверка, чтобы убедиться, что каждая отправка данных формы уникальна.

Например, странице, которая будет отправлять форму, должен быть присвоен уникальный идентификатор, который будет отправлен вместе с формой. Затем бизнес-логика должна быть в состоянии распознать, что отправленная форма уже была обработана (так как уникальный идентификатор (больше не будет) будет таким же), поэтому игнорирует вторую попытку.

«Стандартный способ» по-прежнему не мешает клиентам нажимать кнопку «Назад» дважды ... или даже возвращаться и повторно отправлять форму, если они не думают (по какой-либо причине), что она была обработана.

5 голосов
/ 08 августа 2012
  1. генерирует случайную строку и сохраняет ее в сеансе,

  2. затем выведите его в форму как скрытое значение,

  3. проверить отправленную и сохранить переменную, если совпадения обрабатывают ваш запрос,

  4. перейти к 1.

3 голосов
/ 08 мая 2009

Поместите этот код на страницу формы

Response.Cache.SetCacheability(HttpCacheability.NoCache);

Response.Cache.SetExpires(DateTime.Now-new TimeSpan(1,0,0));

Response.Cache.SetLastModified(DateTime.Now);

Response.Cache.SetAllowResponseInBrowserHistory(false);
2 голосов
/ 20 марта 2009

Вы не должны пытаться «блокировать» эти действия. Что вы должны сделать, это убедиться, что ничего не происходит, когда кто-то «дважды отправляет» форму.

1 голос
/ 23 мая 2014

Я не видел этого здесь, поэтому вот оно.

  1. Поместите уникальный жетон в форму.
  2. Кнопка отправки запускает запрос xmlhttp (ajax) на сервер для создания переменной сеанса, названной в честь токена с сохраненным значением 1.
  3. Запрос Ajax отправляет форму после получения положительного изменения состояния.
  4. Скрипт обработки формы проверяет переменную сеанса с сохраненным значением 1.
  5. Скрипт удаляет переменную сеанса и обрабатывает форму.

Если переменная сеанса не найдена, форма не будет обработана. Поскольку переменная удаляется сразу после ее обнаружения, форму можно запустить только нажатием кнопки «Отправить». Обновить и обратно не отправит форму. Это будет работать без использования перенаправления.

1 голос
/ 20 марта 2009

Лучший способ - иметь достаточную логику обработки сеанса, чтобы вы могли распознать вторую (и далее) попытку как «это просто повторная подача» и игнорировать ее.

1 голос
/ 20 марта 2009

и в каком-то браузере вы даже не можете этого сделать, и это хорошо!

0 голосов
/ 25 июля 2014

Этот код не работает с текущей страницы меня ..

Здесь я поместил код, который помогает вам, не открывать контекстное меню и при перезагрузке браузера попросить вас покинуть страницу или нет ...

Я пытаюсь спросить, нажмите на кнопку браузера назад

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;
    });
});});

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...