2012-02-01 50 views
1

我有一種情況,其中存在從用戶和鏈接獲取值的鏈接將共享給用戶。多個用戶可以打開相同的鏈接,如果他們嘗試填充由於競爭條件而被覆蓋的值。如何查找共享jsp文件是否被多個用戶訪問?

一些機構可以建議如果用戶打開鏈接,一個機制,如果另一個用戶試圖打開相同的鏈接,他應該能夠看到一些信息,一些身體其他還查看/修改的內容。

+0

該問題被稱爲重複表單提交。搜索它:) – 2012-02-01 11:49:34

回答

0
  • 添加過濾器
  • 有一個應用程序作用域同步地圖
  • 時,有一個請求,即將設置一些標誌,當用戶完成編輯,你可以重置該標誌,如果平均,而另一個用戶自帶基於在國旗上,你可以自己重定向到另一頁

更新:

如果第一個用戶打開url,那麼我會更新同步地圖的一些細節。如果第二位用戶進來,我會將他重定向到其他頁面。現在如果第一個用戶沒有提交更改,那麼第二個用戶將永遠被阻止。有沒有辦法避免這種情況?

你可以把時間戳當它被鎖定和釋放特定時間 後,你也可以做一個AJAX投票,這樣,如果USER1已經關閉了編輯/瀏覽器,它不會輪詢這樣的地圖會說,這是在編輯不再是現在

+0

我在這裏有一個問題,如果第一個用戶打開網址,那麼我會更新同步地圖的一些細節。如果第二位用戶進來,我會將他重定向到其他頁面。現在如果第一個用戶沒有提交更改,那麼第二個用戶將永遠被阻止。有沒有辦法避免這種情況? – Aditya 2012-02-01 11:58:01

+0

查看更新。 – 2012-02-01 12:02:52

0

保持一個標誌ServletContext的話說,頁面正在編輯。

1)當用戶訪問共享頁面使用servletContext.setAttribute("linkEdited", "true")設置標誌。另外,請在用戶會話中使用session.setAttribute("linkEdited", "true")

2)取消設置值時,用戶提交的細節輸入servletContext.setAttribute("linkEdited", null)session.setAttribute("linkEdited", null)和。

3)未設置(執行步驟2)當會話獲取超時並且session.getAttribute("linkEdited")返回true時。當會話超時時,HttpSessionListener.sessionDestroyed()將被調用。

4)當任何用戶訪問共享頁面檢查session.getAttribute("linkEdited")servletContext.getAttribute("linkEdited")。如果該屬性設置爲true,請給出消息說正在編輯頁面。

0

讓一些id成爲正在共享的URL的一部分(作爲查詢參數)。當第一位用戶點擊該鏈接時,該ID被傳遞到服務器,然後您知道用戶1正在處理它。現在這個ID是活動的。當第二位用戶點擊它時,相同的ID被髮送到服務器,您現在可以根據當前活動的ID對其進行驗證。

2

這種策略被稱爲悲觀鎖定。這通常不是一個好策略,因爲你不知道第一個鎖定數據的用戶何時完成編輯。他本可以關閉他的瀏覽器,並且永遠不會釋放鎖。您當然可以使用超時機制,但是您必須處理第一個用戶在超時後提交修改(如果超時時間很短)的情況,或者您禁止任何用戶編輯數據的時間過長(如果超時時間很長)。

處理這種情況的常用方法是使用樂觀鎖定:您讓每個人都編輯數據,但每次提交時,都會檢查提交的版本號(使用隱藏字段)是否與在存儲的數據。如果是這樣,編輯成功,並且您增加數字。如果沒有,那麼你告訴用戶其他人修改了數據。

+0

應該可以讓JavaScript通過ajax調用來ping服務器,以指示用戶在頁面上仍然處於活動狀態。 – MrKiane 2012-02-01 11:55:10

+0

即使瀏覽器已關閉,當會話獲得超時rt時,我們可以重置鎖。 – 2012-02-01 12:02:39

+0

即使我喜歡比悲觀的樂觀鎖定。好主意。 – 2012-02-01 12:04:34

0

您可以存儲一些信息(例如,在共享地圖等中)內容已被查看。

我想你不希望信息被顯示,如果另一個用戶訪問相同的JSP但具有不同的數據。因此,您應該將信息存儲在正在訪問的數據中,而不是JSP本身。然後檢查最近是否有數據訪問,以及用戶何時完成刪除「正在訪問」信息(或減少計數器)。

如果您希望只有一個用戶能夠同時編輯數據,則只要數據已被訪問,就以只讀模式顯示JSP。如果他們可能同時編輯,則可能需要使用樂觀鎖定以FIFO方式處理更新。

問題可能仍然是訪問數據時結束的會話。因此,您需要一些超時來移除任何懸掛的鎖(很像會話超時)。

相關問題