gpt4 book ai didi

java - 在无状态 Web 应用程序中是否有防止双重提交的技术?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:49:15 26 4
gpt4 key购买 nike

我想在现有的 java web 应用程序(实际上是 struts)中实现防止双重提交。在架构方面,我们谈论的是 2 到 N 个可能的应用程序服务器 (tomcat) 和一个数据库服务器 (mysql)。各个服务器彼此不认识,无法交换消息。在应用程序服务器前面有一个负载均衡器,它能够执行粘性 session

所以基本上有两种防止双重提交客户端和服务器端。如果可能的话,我想去服务器端,因为如果人们在浏览器中禁用 cookie 和/或 javascript,所有客户端技术似乎都会失败。

这让我想到了通过数据库锁进行某种类似互斥锁的同步。我认为可以计算用户输入数据的校验和并将其保存到专用数据库表中。在每次提交时,应用程序都必须检查是否存在相等的校验和,这将表明给定的提交是重复的。当然,这个表中的校验和必须定期清除。问题在于检查数据库中是否已经存在重复校验和并在没有校验和的情况下插入校验和的整个过程几乎是关键部分。因此校验和表必须预先锁定,并在节后再次解锁。

当我想到表锁时,我的死锁瓶颈 警钟开始响起。所以我的问题是:是否有更明智的方法来防止无状态 Web 应用程序中的双重提交?

请注意struts TokenInterceptor不能在这里应用,因为当 cookie 被禁用时它会失败(它依赖于没有 session cookie 根本不存在的 HTTP session )。

最佳答案

一个更简单的基于数据库的解决方案应该是这样的。这也可以在多种形式中通用。

  • 有一个可用于存储 token 的数据库表。
  • 显示新表单时 - 将新行插入标记表并将 token 添加为表单中的隐藏字段。
  • 当您收到表单提交时,在行上执行选择更新对应于您作为表单的一部分收到的 token 。
  • 如果该行仍然存在,那么这是第一次提交。处理提交并删除该行。
  • 如果该行不存在,则表单已处理 -你可以返回一个错误。

关于java - 在无状态 Web 应用程序中是否有防止双重提交的技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7473949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com