Question
在Web應用中,采用POST提交信息是非常常見的,然而如果目標頁面打開得太慢,用戶就可能會刷新頁面,這時候之前已經提交過的信息就會被重復提交。即使用戶成功打開了POST提交目標頁,之后他通過鏈接導航到別處了,再退回到POST提交目標頁時仍可能會重復提交頁面(例如因為瀏覽器緩存已失效)。而且,只要碰到重復POST提交的場景,瀏覽器就會問用戶是否確認重做此操作,用戶并不一定能正確理解重做意味著重做什么,瀏覽器又不允許網站向用戶解釋清楚,所以這屬于非常不友善的設計。那么我們應該如何避免用戶刷新帶來的重復提交呢?
Answer
有一種最簡單的模式能夠解決這個問題,叫做PRG,也就是Post-Redirect-Get。在用戶提交信息后,我們不要在POST提交的目標URL返回結果頁面,而返回一個302將瀏覽器重定向到真正的結果顯示頁,然后瀏覽器通過GET去獲取那個頁面。
這樣做的話,用戶刷新結果頁,或者通過歷史記錄回到該頁面,都不會導致瀏覽器要重新進行POST,自然也就不會出現煩人的是否重做對話框了。而對于你來說,也有效避免了用戶重復提交信息的可能性。