【问题标题】:POST without Redirect/GET?POST 没有重定向/GET?
【发布时间】:2011-12-17 16:32:21
【问题描述】:

我的一位同事正在努力防止重复提交表单(成功提交后,我们会收到电子邮件并创建一个数据库条目)。如果表单有错误,则提交不成功。

我正在查看他的代码,我注意到他只在成功提交时使用了 P/R/G。如果表单提交不成功,刷新/重新访问时仍会重复提交表单。我在我的评论中注意到了这一点,但他认为他没有看到每次重定向的好处,因为不成功的提交被忽略了。我注意到如果用户刷新页面或在历史记录中重新访问它,他们仍然会在主要浏览器中收到“确认表单重新提交”警告。

这是否足以在每次 POST 后重定向?不管是否如此,即使提交是幂等的(由于表单中的错误),在 POST 之后是否还有其他原因要重定向?提交表单后是否有理由重定向?

【问题讨论】:

  • 我个人在浏览器的每一个 POST 之后都会发出 303,因为我从不想要“确认表单重新提交”。我会自己处理。我认为这是最佳实践,其他人可能会不同意,所以这不是答案。不过,关于这一点的一点是,我通常使用会话——这使得将错误消息等传递回浏览器更容易,这不符合 REST,所以这取决于你的要求。

标签: post-redirect-get


【解决方案1】:

主要原因是由于在 POST 操作后点击“返回”或“重新加载”按钮时,每个现代浏览器都会打开令人讨厌的对话框(人们经常这样做,无论您是否愿意),警告POST 重新提交即将发生。我当然理解他们为什么选择这样做,但这确实意味着作为程序员,我们会竭尽全力确保用户不必看到消息。

所以,我不同意那些说在不成功的帖子后没有理由重定向的人。理论上不应该有,是的,但是由于浏览器的用户界面问题,是的,你绝对需要。

【讨论】:

    【解决方案2】:

    在 POST 失败后没有理由重定向。重复它不会造成任何伤害,而且它会让您的生活更轻松,因为您不需要在会话中存储所有表单值以重新填写表单。

    除此之外,在开发过程中,它使事情变得更加容易,尤其是在使用文件上传字段时,因为您可以让表单提交总是失败,然后按 F5 直到您的所有验证代码等都正常工作。

    【讨论】:

    • 您也可以在提交表单时不重定向。
    • 那么你也需要代码在这两个地方渲染表单。
    猜你喜欢
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2017-07-02
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多