POST 后重新加载浏览器窗口而不提示用户重新发送 POST 数据

IT技术 javascript
2021-02-21 08:23:43

当用户访问我的网站时,每个页面上都有一个“登录”链接。单击它会使用一些 JavaScript 来显示一个覆盖窗口,提示用户输入他们的凭据。输入这些凭据后,会对 Web 服务器进行 Ajax 调用以验证它们;如果它们有效,则发送回身份验证票证 cookie 并重新加载页面,以便显示页面上特定于经过身份验证的用户或(现在)当前登录用户的任何内容。

我正在使用以下脚本通过脚本完成页面重新加载:

window.location.reload();

这对于通过 GET 请求(绝大多数)加载的页面非常有效,但有些页面使用回发表单。因此,如果用户转到这些页面之一,执行回发,然后选择登录,则当window.location.reload()脚本运行时,会出现对话框提示他们是否要重新提交 POST 正文。

重新提交 POST 正文对话框

我想解决这个问题,我可以告诉浏览器重新加载页面,所以我尝试了:

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

但是浏览器不会对上述语句采取任何行动,我推测是因为它认为新 URL 与旧 URL 相同。如果我将上述更改为:

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

它重新加载页面,但我丢失了任何查询字符串参数。

我目前的解决方法是足够的,但不是很好 - 简而言之,我将查询字符串参数附加到当前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 数据?我需要确保任何现有的查询字符串参数都不会丢失。

6个回答
window.location.href = window.location.href;

不要问我为什么它有效..但它确实:)。
就像 js 引擎解释我想的逻辑一样。

这不是一个好的答案,因为只是不发送发布数据。
2021-04-19 08:23:43
感谢您的回答。它确实可以跨浏览器工作。但是我必须声明它只适用于所有浏览器,如果提交表单后它没有加载相同的页面。@rinogo
2021-04-27 08:23:43
有趣的是,这显然没有做它应该做的事情,但访问此页面的人继续投票……也许人们来到此页面试图与 OP 的意图相反(例如“重新加载”页面并省略 POST 参数)
2021-05-11 08:23:43
也不适用于 GET,至少在 Firefox 上这不起作用。
2021-05-17 08:23:43

您可能需要做的是在 POST / Form Handler 脚本运行后重定向用户。

在 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 变量不会在标头中发送(因此不会在刷新时重新发布)

问题是该应用程序是一个 ASP.NET Web 窗体应用程序,所以有很多回发,我无法修改这个根深蒂固的 ASP.NET 功能。
2021-04-20 08:23:43
对 .NET 功能的修改可能需要另一个问题。我想我想说的是,这个问题的“解决方案”将是攻击原因(这不是在发布后重定向用户)——我希望我对 .NET 有更多的了解以帮助你=/
2021-05-07 08:23:43

这也有效:

window.location.href = window.location.pathname + window.location.search
这不会发送帖子值
2021-05-01 08:23:43
也许吧,但这比之前的答案更好,建议“window.location.href = window.location.href;” 会起作用,而不会起作用。
2021-05-03 08:23:43

这对我有用。

window.location = window.location.pathname;

经过测试

  • 铬 44.0.2403
  • IE边缘
  • 火狐 39.0

利用

RefreshForm.submit(); 

代替

document.location.reload(true); 
如果您使用的是 jQuery,则可以向提交按钮添加唯一 ID,然后调用 $("my_button_id").click()
2021-05-15 08:23:43