如何查找共享的jsp文件是否被多个用户访问?

时间:2012-02-01 11:41:38

标签: java jsp java-ee servlets

我的情况是有一个链接从用户获取值并且链接被共享给用户。多个用户可以打开相同的链接,如果他们尝试填充值,他们会因竞争条件而被覆盖。

有些机构可以建议一种机制,如果用户打开链接,并且如果另一个用户试图打开相同的链接,他应该能够看到一些其他人正在查看/修改内容的信息。

5 个答案:

答案 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方式处理更新。

问题可能仍然是在访问数据时结束的会话。因此,您需要一些超时来删除任何悬空锁(很像会话超时)。