我的应用程序是一个基于表单的应用程序,用户可以在其中提出请求,该请求将分配一个 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/