我的情况是有一个链接从用户获取值并且链接被共享给用户。多个用户可以打开相同的链接,如果他们尝试填充值,他们会因竞争条件而被覆盖。
有些机构可以建议一种机制,如果用户打开链接,并且如果另一个用户试图打开相同的链接,他应该能够看到一些其他人正在查看/修改内容的信息。
答案 0 :(得分:2)
这种策略称为悲观锁定。它通常不是一个好策略,因为您无法判断锁定数据的第一个用户何时完成了编辑。他本可以关闭他的浏览器,从不释放锁。您当然可以使用超时机制,但是您必须处理第一个用户在超时后提交修改的情况(如果超时很短),或者您禁止任何用户编辑数据的时间太长(如果超时很长。)
处理这种情况的常用方法是使用乐观锁定:您允许每个人编辑数据,但每次提交时,都会检查提交的版本号(带有隐藏字段)是否与提交的版本号相同存储的数据。如果是,则编辑成功,并增加编号。如果没有,那么您告诉用户其他人已经修改了数据。
答案 1 :(得分:0)
更新:
如果第一个用户打开了网址,那么我将使用一些细节更新同步地图。如果第二个用户进来,那么我会将他重定向到其他页面。现在,如果第一个用户未提交更改,则第二个用户将永久被阻止。有办法避免这种情况吗?
您可以将时间戳置于锁定状态并在特定时间后释放 你也可以进行ajax调查,这样如果user1关闭了编辑/浏览器,它就不会进行轮询,所以地图会说现在不再进行编辑了
答案 2 :(得分:0)
在ServletContext中保留一个标志,说明页面正在编辑中。
1)当用户访问共享页面时,使用servletContext.setAttribute("linkEdited", "true")
设置标志。另外,在用户会话中设置session.setAttribute("linkEdited", "true")
。
2)当用户提交输入的详细信息servletContext.setAttribute("linkEdited", null)
和session.setAttribute("linkEdited", null)
时,取消设置值。
3)当会话达到timedout并且session.getAttribute("linkEdited")
返回true时,取消设置(执行步骤2)。当会话超时时,将调用HttpSessionListener.sessionDestroyed()
。
4)当任何用户访问共享页面时,请检查session.getAttribute("linkEdited")
和servletContext.getAttribute("linkEdited")
。如果该属性设置为true,则显示消息,指出正在编辑该页面。
答案 3 :(得分:0)
让一些id成为正在共享的URL(作为查询参数)的一部分。当第一个用户单击链接时,id将传递给服务器,然后您知道用户1正在处理它。现在该ID处于活动状态。当第二个用户点击它时,相同的ID将被发送到服务器,您现在可以根据当前活动的ID进行验证。
答案 4 :(得分:0)
您可以存储内容已被查看的一些信息(例如,在共享地图等中)。
如果另一个用户访问相同的JSP但数据不同,我猜你不希望显示这些信息。因此,您应该存储有关正在访问的数据的信息,而不是JSP本身。然后检查最近是否已访问该数据以及用户何时完成删除“被访问”信息(或减少计数器)。
如果只希望一个用户能够同时编辑数据,则只要数据已被访问,就以只读模式显示JSP。如果他们可能并发编辑,您可能希望使用乐观锁定以FIFO方式处理更新。
问题可能仍然是在访问数据时结束的会话。因此,您需要一些超时来删除任何悬空锁(很像会话超时)。