簡體   English   中英

為什么PRG模式而不是其他?

[英]Why PRG pattern rather than others?

我需要阻止為客戶的網站提交重復的表單。

  • 我們需要用戶的一些表單數據來進行訂單確認頁面。
  • 我們對Web服務器使用負載均衡。

方法1:發布/重定向/獲取

(PRG模式: http//en.wikipedia.org/wiki/Post/Redirect/Get 郵政/重定向/獲取

我最初嘗試使用PRG模式。
在這種情況下,我認為我需要跨多個Web服務器處理會話(或spring flashmap)。

方法2:在客戶端禁用刷新。

禁用客戶端上的刷新

我的一位同事提出了這種方法。

方法3:郵寄/郵寄

郵政/后

另一位同事提出了這種方法。

我認為方法2,3不是一個好的選擇。
我不知道這些方法的具體缺點或安全風險
我試圖谷歌,但我沒有找到答案。

先感謝您。

[編輯]

我想更新優缺點。

方法1:發布/重定向/獲取

利弊

  • 安全!

缺點

  • 如果您需要來自用戶的某些表單數據以在確認頁面上顯示它,您需要使用sessiondatabase或其他東西。
  • 如果您使用session ,並且有多個服務器,則必須執行某些操作以使會話可在多個服務器上使用。

方法2:在客戶端禁用刷新。

利弊

缺點

  • 如果限制瀏覽器標准功能(如刷新),用戶將會感到不安。
  • 需要考慮F5,Ctrl + F5,⌘+ F5等,各種刷新圖標。
  • 在移動設備中,許多Web瀏覽器在用戶重新加載瀏覽器時自動刷新頁面

方法3:郵寄/郵寄

利弊

  • 您不必擔心跨多個服務器的會話共享問題。

缺點

  • 第二次表單提交可能會失敗

方法1是一個非常簡單的方法,可以解決一些重復的帖子問題。 它無法應對服務器延遲,這是重復提交的原因。

方法2只不過是錯誤的。 如果限制瀏覽器標准功能(如刷新),用戶將會感到不安。 也就是說,如果你甚至能夠通過技術上跨瀏覽器這樣做。 您需要考慮F5,Ctrl + F5,⌘+ F5等各種刷新圖標。

我必須承認,我並不完全理解方法3的意圖,但是,將用戶反彈到空白頁面感覺有點不對勁。

另一種標准方法是使用帶表單帖子的nounce。 這也可以幫助您避免稱為跨站點請求偽造的安全風險。 這很簡單。

  1. 在服務器上生成一個名為nonce的“唯一”隨機字符串。
  2. 將隨機數插入數據庫。
  3. 將nonce作為隱藏字段附加到表單(或通過URL或類似方式傳遞)。
  4. 確保將nonce以表單形式發送到服務器。
  5. 在服務器端,驗證nonce,刪除nonce,“保存表單數據”。
  6. 顯示確認頁面。

如果你得到另一個非現有nonce的請求,那么你知道它是一個重復的帖子或一些更邪惡的CSRF攻擊。

您可以找到一些支持庫來為您執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM