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

Перезагрузите окно браузера после POST без запроса пользователю повторно отправить данные POST

Когда пользователь посещает мой сайт, на каждой странице есть ссылка "Войти". Нажав на это, вы используете JavaScript, чтобы отобразить окно оверлея, где пользователю предлагается ввести учетные данные. После ввода этих учетных данных на веб-сервер вызывается вызов Ajax для их проверки; если они действительны, файл cookie проверки подлинности отправляется обратно, и страница перезагружается, так что отображается содержимое на странице, которая является специфичной для пользователей, прошедших проверку подлинности, или текущего пользователя (сейчас).

Я выполняю перезагрузку страницы через script, используя:

window.location.reload();

Это прекрасно работает для страниц, загруженных через запрос GET (подавляющее большинство), но на некоторых страницах используются формы обратной передачи. Поэтому, если пользователь переходит на одну из этих страниц, выполняет обратную передачу, а затем выбирает логин, когда запускаются window.location.reload() script, они запрашивают диалоговое окно с вопросом, хотите ли они повторно отправить тело POST.

Resubmit POST body dialog box

Я думал обойти это, я мог просто сказать браузеру перезагрузить страницу, поэтому я попробовал:

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

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

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

Он перезагружает страницу, но я теряю любые параметры запроса.

Мое текущее обходное решение достаточно, но не очень - короче говоря, я привязываю параметр querystring к текущему значению window.location.href, а затем назначаю его обратно window.location.href, вызывая reloadPage("justLoggedIn"), где функция reloadPage является:

function reloadPage(querystringTackon) {
    var currentUrl = window.location.href;

    if (querystringTackon != null && querystringTackon.length > 0 && currentUrl.indexOf(querystringTackon) < 0) {
        if (currentUrl.indexOf("?") < 0)
            currentUrl += "?" + querystringTackon;
        else
            currentUrl += "&" + querystringTackon;
    }

    window.location.href = currentUrl;
}

Это работает, но это приводит к тому, что URL www.example.com/SomeFolder/SomePage.aspx?justLoggedIn, который кажется липким.

Есть ли способ в JavaScript, чтобы заставить его выполнять перезагрузку GET и не запрашивать у пользователя повторную отправку данных POST? Мне нужно убедиться, что любые существующие параметры запроса не потеряны.

4b9b3361

Ответ 1

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

Не спрашивай меня, почему это работает... но это делает:). Просто, как двигатель js интерпретирует логику, я полагаю.

Ответ 2

Возможно, вам нужно перенаправить пользователя после того, как был запущен обработчик POST/Form script.

В PHP это делается так...

<?php
// ... Handle $_POST data, maybe insert it into a database.
// Ok, $_POST data has been handled, redirect the user
header('Location:success.php');
die();
?>

... это должно позволить вам обновить страницу, не получив предупреждение "Отправить данные снова".

Вы даже можете перенаправить на ту же страницу (если это то, что вы публикуете), поскольку переменные POST не будут отправляться в заголовках (и, таким образом, там не будет повторного POST при обновлении)

Ответ 3

Это тоже работает:

window.location.href = window.location.pathname + window.location.search

Ответ 4

Используйте

RefreshForm.submit(); 

вместо

document.location.reload(true); 

Ответ 5

У меня была та же проблема, что и вы.

Вот что я сделал (динамически созданная форма GET с действием, установленным на location.href, скрытый ввод со свежим значением), и, похоже, он работает во всех браузерах:

var elForm=document.createElement("form");
elForm.setAttribute("method", "get");
elForm.setAttribute("action", window.location.href);

var elInputHidden=document.createElement("input");
elInputHidden.setAttribute("type", "hidden");
elInputHidden.setAttribute("name", "r");
elInputHidden.setAttribute("value", new Date().getTime());
elForm.appendChild(elInputHidden);

if(window.location.href.indexOf("?")>=0)
{
    var _arrNameValue;
    var strRequestVars=window.location.href.substr(window.location.href.indexOf("?")+1);
    var _arrRequestVariablePairs=strRequestVars.split("&");
    for(var i=0; i<_arrRequestVariablePairs.length; i++)
    {
        _arrNameValue=_arrRequestVariablePairs[i].split("=");

        elInputHidden=document.createElement("input");
        elInputHidden.setAttribute("type", "hidden");
        elInputHidden.setAttribute("name", decodeURIComponent(_arrNameValue.shift()));
        elInputHidden.setAttribute("value", decodeURIComponent(_arrNameValue.join("=")));
        elForm.appendChild(elInputHidden);
    }
}

document.body.appendChild(elForm);
elForm.submit();

Ответ 6

Это сработало для меня.

window.location = window.location.pathname;

Проверено на

  • Chrome 44.0.2403
  • край IE
  • Firefox 39.0

Ответ 7

Это более старое сообщение, но у меня есть лучшее решение. Создайте форму, содержащую все ваши значения в качестве скрытых полей, и дайте форме имя, например:

<form name="RefreshForm" method="post" action="http://yoursite/yourscript">
    <input type="hidden" name="postVariable" value="PostData">
</form>

Тогда все, что вам нужно сделать в setTimeout, - это RefreshForm.submit();

Ура!

Ответ 9

Вы можете попытаться создать пустую форму, метод = получить и отправить ее.

<form id='reloader' method='get' action="enter url here"> </form>
<script>
// to reload the page, try
document.getElementById('reloader').submit();
</script>

Ответ 10

Чтобы перезагрузить открывающееся окно со всеми параметрами (не все должны быть отправлены с помощью метода window.location.href и метода с формой .submit(), возможно, один шаг до конца), я предпочитаю использовать метод window.history.

window.opener.history.go(0);

Ответ 11

Если у вас есть хеши "#" в вашем URL-адресе, все решения здесь не работают. Это единственное решение, которое сработало для меня.

var hrefa = window.location.href.split("#")[1];
var hrefb = window.location.href.split("#")[2];
window.location.href  = window.location.pathname +  window.location.search + '&x=x#' + hrefa + '#' + hrefb;

URL-адрес должен быть другим для перезагрузки, если у вас есть хэш. Здесь & x = x делает это. Просто замените это на то, что вы можете игнорировать. Это абсурд от взлома, неспособный найти лучшее решение.

Протестировано в Firefox.