【问题标题】:Why the Post/Redirect/Get pattern (PRG pattern) works?为什么 Post/Redirect/Get 模式(PRG 模式)有效?
【发布时间】:2017-09-04 04:34:06
【问题描述】:

我已经阅读了一些关于 PRG 模式以及它如何阻止用户重新提交表单的文章。比如有一张来自this post的好图:

我可以理解为什么用户在收到 2xx 后刷新页面时不会发生表单提交。但我仍然想知道:

(1) 如果用户在重定向响应返回之前刷新页面会发生什么?到时候浏览器最新的action还是POST请求,不会导致重新提交吗?

(2) 如果用户点击“返回”会发生什么?这会导致重新提交吗?

【问题讨论】:

    标签: php asp.net http web browser


    【解决方案1】:

    (1) 如果用户在重定向响应返回之前刷新页面会发生什么?到时候浏览器最新的action还是POST请求,不会导致重新提交吗?

    有两种情况:

    案例 1

    1. 用户请求表单
    2. 用户提交表单
    3. 服务器处理表单并发送重定向
    4. 用户决定在重定向请求到达之前取消页面

    在这种情况下,用户无法刷新页面,因为刷新按钮处于取消模式。所以用户必须取消然后刷新。所以用户取消请求并刷新页面。浏览器将发出历史记录中的最后一个 GET 请求:

    1. User requests form
    

    案例 2

    1. 用户请求表单
    2. 用户提交表单
    3. 服务器处理表单并发送重定向
    4. 浏览器接收到重定向并向重定向 URL 发出 GET
    5. 在服务器处理请求时,用户决定取消

    在这种情况下,用户无法刷新页面,必须取消请求才能刷新。所以用户取消了请求。然后用户刷新,因此浏览器将发出历史记录中的最后一个 GET 请求:

    4. The browser receives the redirect and issues a GET to the redirect URL
    

    这是重要的部分:POST 请求不会保留在浏览器历史记录中,如 here 所述。

    (2) 如果用户点击“返回”会发生什么?这会导致重新提交吗?

    不,不会。只有当用户按下表单提交按钮时才会发生提交。

    如果你没有做PRG模式,那么浏览器会注意到点击后退按钮时可能会发生表单提交,它会提示用户:

    您要查找的页面使用了您输入的信息。返回该页面可能会导致您重复执行的任何操作。要继续吗?

    或类似的东西,取决于浏览器。

    【讨论】:

    • 感谢您的回答,但我还是有点困惑。您提到刷新/返回基于浏览器历史记录,并且 POST 请求不会保留在浏览器历史记录中。那为什么不使用PRG模式时可能会出现重新提交?
    猜你喜欢
    • 1970-01-01
    • 2016-11-02
    • 2015-03-08
    • 1970-01-01
    • 2012-03-06
    • 2019-05-21
    • 2011-03-23
    • 2014-05-04
    • 1970-01-01
    相关资源
    最近更新 更多