【问题标题】:Stop Refresh from Resubmitting Form停止刷新重新提交表单
【发布时间】:2011-08-25 15:31:37
【问题描述】:

我做了研究,发现了这个页面:

How do I stop the Back and Refresh buttons from resubmitting my form?

如果我可以避免使用 Post-Redirect-Get 模式,而是在我第一次提交表单时对表单进行一些变量更改,我会更愿意。但是,我不知道这将如何完成,因为当您点击刷新时,您的想法是您正在重新提交刚刚提交的表单。有什么建议吗?

【问题讨论】:

  • 为什么要避免 Post/Redirect/Get?这是正确的解决方案。
  • +1 这是我知道的唯一解决方案

标签: javascript html perl cgi


【解决方案1】:

这通常在 POST 请求之后通过重定向来处理。单击返回只会再次将用户重定向。我知道你提到你想避免这种情况,但我看不出任何正当理由。

【讨论】:

    【解决方案2】:

    当浏览器被告知刷新时,它会重新发送上次发送的请求。如果发送的最后一个请求是表单提交,则将重新提交表单。没有办法解决这个问题,因为这就是模型的工作原理。

    为防止出现不良影响,您必须:

    • 使用 post-redirect-get,以便最后一个请求(重新发送的请求)将是读取表单提交结果而不是表单提交本身的请求 或
    • 在表单中输入一个标识符,以便服务器可以忽略重新提交(尽管用户仍会看到“您要重新提交吗?”确认)

    我不知道任何其他选项,并且考虑到“刷新”的工作方式,我真的不知道还有其他选项。在这两种选择中,post-redirect-get 提供了最简洁的用户体验,并且是理论上最“纯粹”的 HTTP 动词使用,因此它通常是首选,而且 IMO 也是正确的解决方案。

    【讨论】:

    • 解释得好!给了我很多见解,并将我从在节点中执行 render 更改为简单的重定向
    【解决方案3】:

    在隐藏字段中随表单一起发送唯一的表单标识符,例如 UUID。跟踪您已经看到的 UUID(可能是每个会话,因此您的数据库不会无限制地增长或需要偶尔修剪)并静默忽略重新提交。

    【讨论】:

    • 或者缓存提交的结果,当你得到一个已经看到的 uuid 时返回缓存的内容
    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 2015-08-30
    • 2014-04-20
    • 2011-10-21
    • 2014-05-07
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多