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

han*_*ngu 5 java security spring-mvc post-redirect-get web

我需要阻止为客户的网站提交重复的表单.

  • 我们需要用户的一些表单数据来进行订单确认页面.
  • 我们对Web服务器使用负载均衡.

方法1:发布/重定向/获取

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

我最初尝试使用PRG模式.
在这种情况下,我认为我需要跨多个Web服务器处理会话(或spring flashmap).

方法2:在客户端禁用刷新.

禁用客户端上的刷新

我的一位同事提出了这种方法.

方法3:邮寄/邮寄

邮政/后

另一位同事提出了这种方法.

我认为方法2,3不是一个好的选择.
我不知道这些方法的具体缺点或安全风险.
我试图谷歌,但我没有找到答案.

先感谢您.

[编辑]

我想更新优缺点.

方法1:发布/重定向/获取

利弊

  • 安全!

缺点

  • 如果从用户需要某种形式的数据显示它确认页面上,你需要使用session,database或什么的.
  • 如果您使用session并拥有多个服务器,则必须执行某些操作以使会话可在多个服务器上使用.

方法2:在客户端禁用刷新.

利弊

缺点

  • 如果限制浏览器标准功能(如刷新),用户将会感到不安.
  • 需要考虑F5,Ctrl + F5,⌘+ F5等,各种刷新图标.
  • 在移动设备中,许多Web浏览器在用户重新加载浏览器时自动刷新页面

方法3:邮寄/邮寄

利弊

  • 您不必担心跨多个服务器的会话共享问题.

缺点

  • 第二次表单提交可能会失败

Pet*_*der 6

方法 1 是一种非常简单的方法,可以解决一些重复的帖子问题。它无法应对服务器延迟,而服务器延迟是重复提交的原因。

\n\n

方法2是完全错误的。如果您限制浏览器标准功能(例如刷新),用户会感到不安。也就是说,如果您甚至能够在技术上跨浏览器这样做。您需要考虑 F5、Ctrl+F5、\xe2\x8c\x98 + F5 等各种刷新图标。

\n\n

我必须承认,我并不完全理解方法 3 的意图,但是,将用户弹回空白页面感觉有点不对。

\n\n

另一种标准方法是使用带有表单帖子的通知。这还将帮助您避免称为跨站点请求伪造的安全风险。这很简单。

\n\n
    \n
  1. 在服务器上生成一个“唯一”的随机字符串,称为随机数。
  2. \n
  3. 将随机数插入数据库。
  4. \n
  5. 将随机数作为隐藏字段附加到表单(或通过 URL 或类似字段传递)。
  6. \n
  7. 确保随机数以发布形式发送到服务器。
  8. \n
  9. 在服务器端,验证随机数,删除随机数,“保存表单数据”。
  10. \n
  11. 显示确认页面。
  12. \n
\n\n

如果您收到另一个带有不存在的随机数的请求,那么您就知道它要么是重复的帖子,要么是一些更邪恶的 CSRF 攻击。

\n\n

您也许可以找到一些支持库来为您完成此操作。

\n