Why the Post/Redirect/Get pattern (PRG pattern) works?

时间:2017-04-08 22:33:46

标签: php asp.net http web browser

I have read some articles about the PRG pattern and how it prevents users from resubmitting forms. For example, there is a good picture from this post:

enter image description here

I can understand why no form submission will happen when user refresh the page after 2xx has been received. But I am still wondering:

(1) What happens if the user refreshes the page before the redirect response coming back? At that time, the newest action in the browser is still the POST request, wouldn't that lead to resubmission?

(2) What happens if the user click "back"? Will this lead to resubmission?

1 个答案:

答案 0 :(得分:0)

  

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

有两种情况:

案例1

  1. 用户请求表
  2. 用户提交表单
  3. 服务器进程表单并发送重定向
  4. 用户决定在重定向请求到达之前取消该页面
  5. 在这种情况下,用户无法刷新页面,因为刷新按钮处于取消模式。因此用户必须取消然后刷新。因此,用户取消请求并刷新页面。浏览器将在历史记录中发出最后一个GET请求:

    1. User requests form
    

    案例2

    1. 用户请求表单
    2. 用户提交表单
    3. 服务器处理表单并发送重定向
    4. 浏览器接收重定向并向重定向网址发出GET
    5. 当服务器正在处理请求时,用户决定取消
    6. 在这种情况下,用户无法刷新页面,必须取消请求才能刷新。因此用户取消请求。然后用户刷新,因此浏览器将在历史记录中发出最后一个GET请求:

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

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

        

      (2)如果用户点击“返回”会怎样?这会导致重新提交吗?

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

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

        

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

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