2017-04-08 49 views
1

我讀過一些關於PRG模式的文章,以及它如何防止用戶重新提交表單。例如,有一個從this post一個好的圖片:爲什麼Post/Redirect/Get模式(PRG模式)有效?

enter image description here

我可以理解爲什麼當用戶2XX已收到後刷新頁面沒有表單提交會發生。但我仍然在想:

(1)如果用戶在重定向響應回來之前刷新頁面會發生什麼?那時候,瀏覽器中的最新操作仍然是POST請求,是不是會導致重新提交?

(2)如果用戶點擊「返回」會發生什麼?這會導致重新提交嗎?

回答

0

(1)如果用戶在重定向響應回來之前刷新頁面會發生什麼?那時候,瀏覽器中的最新操作仍然是POST請求,是不是會導致重新提交?

有兩種情況:

CASE 1

  1. 用戶請求形式
  2. 用戶提交形式
  3. Server處理形式和發送重定向
  4. 用戶決定在重定向請求到達之前取消頁面

在這種情況下,用戶無法刷新頁面,因爲刷新按鈕處於取消模式。所以用戶必須取消然後刷新。所以用戶取消請求並刷新頁面。該瀏覽器將發出在歷史上這是最後一個GET請求:

1. User requests form 

CASE 2

  1. 用戶請求
  2. 用戶提交表單
  3. 服務器處理的形式和形式發送重定向
  4. 瀏覽器收到重定向並向重定向URL發出GET
  5. 在服務器處理請求,用戶決定取消

在這種情況下,用戶不能刷新頁面,必須取消以刷新請求。所以用戶取消了請求。然後,用戶刷新,所以瀏覽器會發出的這是歷史上最後一個GET請求:

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

這裏是重要的部分:提到herePOST請求不留在瀏覽器歷史記錄

(2)如果用戶點擊 「返回」,會發生什麼?這會導致重新提交嗎?

不,不會。提交只能在用戶按下表單提交按鈕時發生。

如果你沒有做PRG模式,那麼瀏覽器就會發現,在單擊可能發生表單提交後退按鈕,它會提示用戶:

你正在查找的頁使用了您輸入的信息。回到該頁面可能會導致您重複執行的任何操作。你想繼續嗎?

或者類似的取決於瀏覽器的東西。

+0

謝謝您的回答,但我還是有點困惑。您提到刷新/返回基於瀏覽器歷史記錄,並且POST請求不會保留在瀏覽器歷史記錄中。那麼爲什麼在不使用PRG模式時可能會發生重新提交? –