我有一種情況,其中存在從用戶和鏈接獲取值的鏈接將共享給用戶。多個用戶可以打開相同的鏈接,如果他們嘗試填充由於競爭條件而被覆蓋的值。如何查找共享jsp文件是否被多個用戶訪問?
一些機構可以建議如果用戶打開鏈接,一個機制,如果另一個用戶試圖打開相同的鏈接,他應該能夠看到一些信息,一些身體其他還查看/修改的內容。
我有一種情況,其中存在從用戶和鏈接獲取值的鏈接將共享給用戶。多個用戶可以打開相同的鏈接,如果他們嘗試填充由於競爭條件而被覆蓋的值。如何查找共享jsp文件是否被多個用戶訪問?
一些機構可以建議如果用戶打開鏈接,一個機制,如果另一個用戶試圖打開相同的鏈接,他應該能夠看到一些信息,一些身體其他還查看/修改的內容。
更新:
如果第一個用戶打開url,那麼我會更新同步地圖的一些細節。如果第二位用戶進來,我會將他重定向到其他頁面。現在如果第一個用戶沒有提交更改,那麼第二個用戶將永遠被阻止。有沒有辦法避免這種情況?
你可以把時間戳當它被鎖定和釋放特定時間 後,你也可以做一個AJAX投票,這樣,如果USER1已經關閉了編輯/瀏覽器,它不會輪詢這樣的地圖會說,這是在編輯不再是現在
我在這裏有一個問題,如果第一個用戶打開網址,那麼我會更新同步地圖的一些細節。如果第二位用戶進來,我會將他重定向到其他頁面。現在如果第一個用戶沒有提交更改,那麼第二個用戶將永遠被阻止。有沒有辦法避免這種情況? – Aditya 2012-02-01 11:58:01
查看更新。 – 2012-02-01 12:02:52
保持一個標誌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,請給出消息說正在編輯頁面。
讓一些id成爲正在共享的URL的一部分(作爲查詢參數)。當第一位用戶點擊該鏈接時,該ID被傳遞到服務器,然後您知道用戶1正在處理它。現在這個ID是活動的。當第二位用戶點擊它時,相同的ID被髮送到服務器,您現在可以根據當前活動的ID對其進行驗證。
這種策略被稱爲悲觀鎖定。這通常不是一個好策略,因爲你不知道第一個鎖定數據的用戶何時完成編輯。他本可以關閉他的瀏覽器,並且永遠不會釋放鎖。您當然可以使用超時機制,但是您必須處理第一個用戶在超時後提交修改(如果超時時間很短)的情況,或者您禁止任何用戶編輯數據的時間過長(如果超時時間很長)。
處理這種情況的常用方法是使用樂觀鎖定:您讓每個人都編輯數據,但每次提交時,都會檢查提交的版本號(使用隱藏字段)是否與在存儲的數據。如果是這樣,編輯成功,並且您增加數字。如果沒有,那麼你告訴用戶其他人修改了數據。
應該可以讓JavaScript通過ajax調用來ping服務器,以指示用戶在頁面上仍然處於活動狀態。 – MrKiane 2012-02-01 11:55:10
即使瀏覽器已關閉,當會話獲得超時rt時,我們可以重置鎖。 – 2012-02-01 12:02:39
即使我喜歡比悲觀的樂觀鎖定。好主意。 – 2012-02-01 12:04:34
您可以存儲一些信息(例如,在共享地圖等中)內容已被查看。
我想你不希望信息被顯示,如果另一個用戶訪問相同的JSP但具有不同的數據。因此,您應該將信息存儲在正在訪問的數據中,而不是JSP本身。然後檢查最近是否有數據訪問,以及用戶何時完成刪除「正在訪問」信息(或減少計數器)。
如果您希望只有一個用戶能夠同時編輯數據,則只要數據已被訪問,就以只讀模式顯示JSP。如果他們可能同時編輯,則可能需要使用樂觀鎖定以FIFO方式處理更新。
問題可能仍然是訪問數據時結束的會話。因此,您需要一些超時來移除任何懸掛的鎖(很像會話超時)。
該問題被稱爲重複表單提交。搜索它:) – 2012-02-01 11:49:34