代码之家  ›  专栏  ›  技术社区  ›  Rüdiger

如何限制用户在已编辑的前端中编辑同一项目

  •  0
  • Rüdiger  · 技术社区  · 6 年前

    我有一个应用程序,用户可以通过一个网站在我的数据库中显示和编辑项目。现在,为了确保在两个用户编辑同一个项目时不会出现即将出现的问题,我想阻止他们这样做。这意味着,第一个访问该项的用户可以对其进行编辑,其余的用户只能查看该项。但遗憾的是,我不知道如何正确地实现这一点。让我们先看看设置:

    我有一个像这样的控制器:

    @RestController
    @RequestMapping(value="/item")
    public class ItemController {
    
        @Autowired 
        ItemService itemService;
    
        @GetMapping(value="/getItem/{item_id}")
        public ResponseEntity getItem(@PathVariable String item_id) {
            this.itemService.getItemById(item_id);
            return ResponseEntity.ok(HttpStatus.OK);
        }
    
    }
    

    现在什么时候 getItem 调用时,我知道用户使用给定的 item_id 从前端开始。所以我可以在我的 Controller ,其中包含元素并检查 格雷特姆 -方法:“如果项目ID在列表中,则返回 Access denied &重定向到“仅查看”组件,否则 ok “。但这似乎是一个很容易解决的问题,我不能想象这就是它要解决的方式。另外,我需要以可靠的方式从列表中删除项目。

    是否有一个模式或类似的东西可以说明如何解决这个问题?

    我正在使用 Spring-Boot Angular 7 如果有帮助的话。

    1 回复  |  直到 6 年前
        1
  •  2
  •   DeborahK    6 年前

    这尤其困难,因为有很多原因,包括你提到的原因。如果您锁定了一行,而使用该锁定的用户只需关闭浏览器,该怎么办?然后这排锁死了。或者你会运行一个晚上的例行程序来清除所有的锁,但是直到第二天用户才能访问记录,等等。

    一般来说,自从数据库被发明以来,这就是一个问题,所以你会认为已经找到了一个解决方案,但我不知道。通常,我会尝试推荐通过业务流程而不是软件将这种情况最小化的方法。

    在软件中,您可以考虑不锁定,而是通过保留时间戳来提供进一步最小化多个更新的影响的方法。当用户得到一行,然后发布来更新它时,系统将检查时间戳是否仍然相同。如果是这样,它允许更新。如果没有,它要么拒绝更改,要么聪明一点,尝试确定其数据与当前数据的区别,并尽可能地合并值。

    您可以在此处阅读更多信息: Optimistic vs. Pessimistic locking

    推荐文章