繁体   English   中英

防止返回按钮显示 POST 确认警报

[英]Prevent Back button from showing POST confirmation alert

我有一个应用程序向 web 页面提供一长串参数,所以我必须使用 POST 而不是 GET。 问题是当页面显示并且用户单击返回按钮时,Firefox 显示警告:

要显示此页面,Firefox 必须发送将重复之前执行的任何操作(例如搜索或订单确认)的信息。

由于应用程序的构建方式使得返回是一种非常常见的操作,这对最终用户来说真的很烦人。

基本上,我想按照这个页面的方式来做:

http://www.pikanya.net/testcache/

输入内容,提交,然后单击返回按钮。 没有警告,它只是回去。

谷歌搜索我发现这可能是 Firefox 3 中的一个错误,但我想以某种方式得到这种行为,即使他们“修复”了它。

我想它可以使用一些 HTTP 接头,但究竟是哪个?

在此处查看我的 web 编程的黄金法则:

停止向数据库中插入数据两次

它说:“永远不要用身体回应 POST 请求。 总是做这项工作,然后用 Location: header 响应以重定向到更新的页面,以便浏览器使用 GET 请求它”

如果浏览器曾经询问用户重新发布,您的 web 应用程序已损坏。 用户不应该看到这个问题。

一种方法是将 POST 重定向到重定向到 GET 的页面 - 请参阅wikipedia 上的 Post/Redirect/Get

假设您的 POST 是 4K 的表单数据。 大概您的服务器对这些数据做了一些事情,而不是只显示一次然后将其丢弃,例如将其保存在数据库中。 继续这样做,或者如果它是一个巨大的搜索表单,请在数据库中创建一个临时副本,几天后或在使用空间限制时基于 LRU 被清除。 现在创建可以使用 GET 访问的数据表示。 如果它是临时的,则为其生成一个 ID 并将其用作 URL; 如果它是一组永久数据,它可能有一个 ID 或可用于 URL 的东西。 在最坏的情况下,像微小的 url 这样使用的算法可以将一个大的 URL 折叠成一个更小的算法。 重定向 POST 以获取数据的表示。


作为历史记录,这项技术于 1995 年确立实践

避免该警告/行为的一种方法是通过 AJAX 进行 POST,然后将用户单独发送到另一个页面(或不发送)。

我一直在使用 Session 变量来帮助解决这种情况。 这是我多年来一直使用的方法:

//If there's something in the POST, move it to the session and then redirect right back to where we are
if ($_POST) {
    $_SESSION['POST']=$_POST;
    redirect($_SERVER["REQUEST_URI"]);
}

//If there's something in the SESSION POST, move it back to the POST and clear the SESSION POST
if ($_SESSION['POST']) {
    $_POST=$_SESSION['POST'];
    unset($_SESSION['POST']);
}

从技术上讲,您甚至不需要将其放回名为 $_POST 的变量中。 但这有助于我跟踪哪些数据来自哪里。

我有一个应用程序向 web 页面提供一长串参数,所以我必须使用 POST 而不是 GET。 问题是当页面显示并且用户单击返回按钮时,Firefox 显示警告:

你的推理是错误的。 如果请求没有副作用,则应该是 GET。 如果它有副作用,它应该是 POST。 选择不应基于您需要传递的参数数量。

作为另一种解决方案,您可能完全停止使用重定向。

您可以一次处理并呈现处理结果,而无需POST确认警报。 您应该只操作浏览器历史记录 object:

history.replaceState("", "", "/the/result/page")

查看完整简短的答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM