Question

在Web應用中,採用POST提交信息是非常常見的,然而如果目標頁面打開得太慢,用户就可能會刷新頁面,這時候之前已經提交過的信息就會被重複提交。即使用户成功打開了POST提交目標頁,之後他通過鏈接導航到別處了,再退回到POST提交目標頁時仍可能會重複提交頁面(例如因為瀏覽器緩存已失效)。而且,只要碰到重複POST提交的場景,瀏覽器就會問用户是否確認重做此操作,用户並不一定能正確理解重做意味着重做什麼,瀏覽器又不允許網站向用户解釋清楚,所以這屬於非常不友善的設計。那麼我們應該如何避免用户刷新帶來的重複提交呢?

Answer

有一種最簡單的模式能夠解決這個問題,叫做PRG,也就是Post-Redirect-Get。在用户提交信息後,我們不要在POST提交的目標URL返回結果頁面,而返回一個302將瀏覽器重定向到真正的結果顯示頁,然後瀏覽器通過GET去獲取那個頁面。

這樣做的話,用户刷新結果頁,或者通過歷史記錄回到該頁面,都不會導致瀏覽器要重新進行POST,自然也就不會出現煩人的是否重做對話框了。而對於你來説,也有效避免了用户重複提交信息的可能性。