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