java - 防止两个用户从不同的 session 提交相同的表单数据

标签 java race-condition

我的应用程序是一个基于表单的应用程序,用户可以在其中提出请求,该请求将分配一个 ID,用户将填写一些详细信息,然后通过不同的阶段提交。多个用户可以成为一个请求的一部分的问题,因此可能会出现用户 A 和用户 B 同时查看表单的情况。用户A可能先提交,然后用户B提交,这会导致请求只显示用户B提交的信息。为了解决这个问题,我想出了两个解决方案:

-在我们将数据提交给数据库之前,我们进行调用以查看数据是否已经提交(我们在我们的应用程序中使用状态。因此我们将检查“Stage # Pending”的状态)。

-我们为其他一些服务实现了一个Redis缓存。我可以添加类似的内容

public submitRequest() {
  RMap<String, int> requestLockMap = redissonClient.getMap("requestLock");
  if(requestLockMap.get('request_ID') == 0) {
     requestLockMap.put('request_ID', 1);
     ...continue submitting request...
  }
}

这实际上是在使用 Redis 缓存添加竞争条件。但是,我不知道这两者是否都是这种事情的好习惯。有没有更好的选择?我使用 Spring 作为我们的 Java 框架,所以如果有任何解决方案,我愿意听取他们的意见。

最佳答案

为每次提交分配随机生成的 ID 有什么缺点?

例如使用 UUID

UUID.randomUUID().toString()

您将相同请求 ID 的概率降低到统计上的 0。数据库冲突可以视为异常,因为这种情况不太可能发生。

使用这种方法,您还可以避免未经授权的用户可以使用先前的请求 ID 查看/编辑相邻信息的情况。

关于java - 防止两个用户从不同的 session 提交相同的表单数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53489428/

相关文章:

multithreading - 多个线程在缓冲区 : are there consistent arguments stating that it is dangerous? 上写入相同的数据

mysql - 竞争条件下的 INSERT-SELECT 和 UPDATE

java - 在 Google AppEngine JAVA SDK1.9.50 中创建 HTTP 请求时平台方法缺少警告

java - 从服务器发送字符串到客户端 - 将其保存为文本文件

Java ConcurrentHashMap 和同步

Mysql并发SELECT/INSERT

c - 如何防止 get() 和 set() 之间的竞争条件行为?

java - 如何将 scriptlet 更改为 JSTL 显示字符串数组

java - 通用 Comparable 出现编译器错误

java - 在 PreferenceScreen 中显示 ActionBar 看起来很困惑