我有一个带有 Java 和 Hibernate 的 Rest 后端,并且我使用带有版本属性的乐观锁定。 对于并发控制,此版本属性必须发送到客户端,然后通过 post 请求再次发送到服务器。 但是,在 javascript 客户端中,我失去了对此属性完整性的控制,例如:
- 客户端“A”请求资源 1。
- 客户端“B”请求相同的资源。
- 服务器使用资源 1 版本 1 向两个客户端进行响应(在各自的响应中)
- 客户端“A”修改资源并发布帖子以保存更改。
- 服务器处理 post 请求,Hibernate 检查版本号。 1 = 1,因此资源被修改。
- 客户端B玩了javascript,将version属性修改为2,并发出post请求。 服务器处理 post 请求,现在 2 = 2,因此资源被修改,客户端 A 所做的更改丢失。
请记住,这是一个 Rest 后端,因此我无法在服务器中保存传递给每个用户的对象的版本号,或者类似的东西。
那么,如果这是一个像我认为的那样的有效问题,我如何确保版本在客户端中保持不可变?
最佳答案
就我个人而言,我会重新考虑这样做,因为我认为客户端几乎没有动机这样做,并且根据定义,您无法控制客户端发送到 REST 服务的内容。
但是,如果您确实有业务案例,那么一种半解决方案是将版本属性设置为 GUID。这样,只有在拥有最新的 GUID 时才可以提交,而客户端 B 则不会拥有,并且这会使版本控制情况变得更加复杂,因为在请求成功之前不能只加 1。
但是,即使在那里,您也并不完全安全,因为理论上客户端 B 可以执行单独的请求以从资源获取更新的 GUID,然后使用更新的 GUID 重新提交失败的请求。
但是由于客户端 B 可以对更新版本进行编辑以恢复客户端 A 所做的操作并添加自己的操作,因此这本质上与执行此操作相同,并且由于他们有权这样做,因此我们又回到询问我们自己为什么再次担心这个案子。
关于javascript - 如何确保 hibernate 版本号在 javascript 客户端中保持不可变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29973919/