20

我正在使用PRG pattern來避免多個表單提交。然而,它有一個嚴重的缺點 - 你不能簡單地向用戶發送確認信息(顯然,用戶不會看到該頁面,他將被重定向到另一個頁面)。如何在POST + HTTP重定向後向用戶顯示消息

這個問題的解決方案是什麼?我知道他們中的兩個,但沒有一個看起來很完美。

  • 使用自定義重定向URL,如:http://example.com/?msg=data-saved。它是無狀態的,所以我認爲它非常可靠。但是,當用戶複製鏈接,書籤等時會產生問題。
  • 存儲會話變量/ cookie,並在每次加載頁面時檢查它。如果已設置,請將其清除並顯示消息。這看起來沒問題,但我不確定這一點 - 它強烈依賴於Cookie,這有點複雜。

或者也許還有其他方法我不知道?會話和URL參數的一些組合?不知道。

您認爲最好的方法是什麼?哪一個有最少的缺點?優缺點都有什麼?

回答

1

幾乎每個允許用戶依靠cookie登錄的網站都是如此。這不是一個完美的解決方案,但它是我們得到的最好的解決方案。

會話處理也是Web開發框架通常爲您處理的那些事情之一。

1

我使用會話變量方法。我真的不喜歡在URL中嵌入顯示錯誤消息,特別是您注意到的URL保存/共享問題,我喜歡如果用戶重新加載目標頁面,它將成爲一個乾淨的實例。

3

這取決於你在哪個平臺上運行。

Ruby on Rails的調用此閃光燈[:聲明] = 「執行你的行動」,ASP.NET MVC調用此TempData的[ 「通知」] = 「你的行動進行了」 ......

他們基本上只是將數據存儲在HttpSession中,僅用於一次往返。這樣您就可以檢索另一個Web請求上的數據。

+1

換句話說,框架通常會使用鏈接到cookie的會話數據存儲的第二個建議。 – Eli 2009-06-29 14:18:11

8

還有幾個其他堆棧溢出問題涉及到這一點,儘管我不認爲如此清楚地總結這個問題。這裏有幾個:

最便捷的解決方案都是基於會話的或有較嚴重的缺陷(如嵌入在查詢字符串的消息)。

如果你不能保證你有會話,另一個(相當昂貴的)方法是根據表單提交的結果重定向到不同的視圖。例如,您可能會重定向到EditWidgetView,EditWidgetSaveSuccessfulViewEditWidgetSaveErrorView(或者您可能只是不重定向錯誤)。在某些語言和框架中,這對於讓你放棄顯示確認/錯誤消息是不切實際的,但在其他語言和框架中它可能是值得的。

6

如果您不想因爲任何原因而依賴會話,則可以使用Get變量/自定義url,然後如果該變量存在,請檢查參考。如果引用是正確的,則顯示該消息。是的,這增加了對引用發送的依賴,以顯示確認消息,但除此之外,您依賴會話(雖然可靠,但對於所有解決方案都不是100%完美)。

誠實地說,大型網站通常對這種事情非常好,只需在url中添加「actiondone = true」即可。 (我已經注意到Facebook的做它在一些地方。)

+0

謝謝,referer技巧非常聰明 – 2009-07-20 09:39:41

+0

+1,因爲我也在考慮使用「referer」[原文如此]選項;-) – Rafa 2011-01-21 12:42:14

2

即將很晚討論..

你可以使用建議的兩種選項的組合。

在POST請求的客戶端被重定向(303)到一個URL指示存在可能是這種請求的響應消息之後:

Client: GET http://example.com/foo.cgi 
Server: 200 Ok 

Client: POST http://example.com/bar.cgi 
Server: 303 http://example.com/foo.cgi?msg=true 

如果msg參數是true消息將在被查找會話和(如果找到)包含在對客戶的響應中。
如果參數msg! true(或不存在),則跳過查找步驟。

使用此解決方案,您可以防止在URL中顯示實際的消息,該URL僅指示可能存在消息。此外,該消息僅在需要時才顯示(=在會話中找到時)。

另一個優點是,該解決方案還允許在HTTP響應中包含適當的現金控制。