2011-10-09 94 views
4

我有一個隱藏的參數,稱爲「行爲」,應按下提交按鈕,通過值'load','save'之一。F5(刷新)作爲提交

問題是當按下提交按鈕後按下F5(刷新)按鈕,因爲url已經包含'& act = save',因此在F5上實際上實際上將'save'值傳遞給(cgi)再次執行保存操作,即使我沒有按提交按鈕。

的queston是如何防止發送「&行爲=保存」上按下按鈕reffresh?

感謝


謝謝大家,除了提交按鈕是一個'保存'按鈕 - 意味着我希望讓用戶能夠執行額外保存,所以不要離開頁面。 由於這個原因,我不認爲會話可能有助於區分第二次保存或第一次刷新。

回答

2

你真的不能防止用戶按F5 防止頁面重新加載從重新提交的表格 - 即使使用形式POST方法將允許用戶重新發送數據。

兩個共同的東西來克服這個:

  1. 使用會話變量,設置它的第一個表單提交,然後檢查它 - 如果存在,就意味着已經提交,以便忽略它或發佈自定義表單信息。

  2. 成功提交後,將用戶重定向到不同的頁面 - 這種方式點擊F5將重新加載該新頁面,並且不會重新發送數據。

+0

只能重定向會工作,如果是真的會重要會到期,所以如果然後按F5 –

+0

@Simon好點,但我相信在OP的userleaves在這裏是指點擊F5的時候了。如果用戶按下「後退」按鈕,即使重定向也不起作用 - 不能有100%的保護。 –

+0

是否有一種簡單的方法來捕捉刷新事件並更改參數'act'的值? – Mike

6

這裏的核心問題是您在使用POST時應該使用POST。 The HTTP specification says

特別是,該慣例已經確定GET和HEAD方法不應該具有采取檢索以外的其他行爲的意義。

如果您使用POST,那麼瀏覽器至少會警告您重新提交表單。

要避免這種情況,請使用POST-Redirect-GET pattern

+0

謝謝,我將它改爲發佈。正如你所說,現在瀏覽器至少會提醒我重新提交表單。 – Mike

0

比已經提供的解決方案更復雜的解決方案是每次生成帶有表單的頁面時創建操作令牌。這個動作令牌存儲在服務器上併發送給客戶端。當客戶提交表單時,它包含動作令牌。當服務器收到表單提交時,它會根據存儲在該用戶會話中的令牌或令牌來檢查動作令牌。如果它與未過期的令牌匹配,則它允許表單處理繼續並在會話中使令牌過期。

這樣可以防止表單被多次提交,並且還有一個好處,即如果執行得當,它可以幫助減輕跨站請求僞造。