2016-12-31 67 views
0

我有一個Web應用程序,由具有項目的用戶組成,項目屬於單個用戶並且可通過URI :root/project/[pid]訪問。避免同時訪問Web應用程序中的共享資源

現在我有一箇中間件來限制用戶訪問其他項目。儘管我的Web應用程序中也有一項功能,用戶可以通過它與其他用戶共享他們的項目,因此多個用戶可以訪問單個共享項目。

問題是我不希望他們同時訪問同一個項目,比如說project1被user1和user2共享。可以同時訪問URI root/project/project1_id,但不能同時訪問。

我目前正在考慮如何做到這一點,我有一些想法,但想知道是否有最好或更簡單的方法來做到這一點。

我正在考慮改變數據庫中的項目表,使其每當用戶訪問項目網頁時都設置爲true,並在他/她離開網頁或會話結束時取消設置。

但我不確定這是否是最好的選擇。

我使用laravel作爲我的web應用程序的框架。所以在該框架內的解決方案將是偉大的

+0

你想限制訪問某人的原因是什麼?你是否擔心兩個人同時編輯同一頁面? –

+0

你的方法對我來說似乎很體面。但是你必須有一些_un_locking訪問的方式。這可以通過鎖定期限(locked_until)來處理。瞭解Web用戶什麼時候「完成」是一個棘手的問題,所以過期是必要的,因爲你不能指望用戶爲你解鎖文件。但是如果你想把這個責任推給用戶,你可以這樣做。另一個選擇是使用檢查和設置的方法來保存,然後允許2個人同時嘗試訪問,並在過渡期間發生變化時出錯。 –

+0

@willis,它是因爲項目可以編輯,如果我允許項目的相同元素同時編輯或多或少,它可能會變醜 – Snedden27

回答

0

我結束了使用下面提到的解決問題的辦法:

我說在我的項目表中的updated_at時間戳和update_by列其中得到更新evertime有人更新項目

在前端我設置啓動一個長時間輪詢功能,每隔幾秒鐘檢查一次項目表

如果在過去5秒鐘內某個人以外的某個項目中有更新,我在前端獲取了整個更新的項目。

1

Store a version number with each project

當某人開始編輯項目中的某些內容時,將當前版本號發送到瀏覽器。保存編輯時,請將版本號發送回服務器。如果版本號匹配,則保存更改並增加版本。如果版本號不匹配,則其他人同時編輯了該項目。當用戶正在編輯時,定期調用服務器以檢查版本號是否已更改,並顯示「其他用戶已更改此項目」(如果有)。每次有人開始編輯時,您也可以將某些內容保存到數據庫中,因此如果第二個人在特定時間間隔內開始編輯項目,則可以顯示「X正在編輯此項目」。

我會使用這種策略,而不是讓鎖定阻止第二個人啓動新的編輯,因爲在網絡上很難確定是否已經完成了已啓動的操作。如果用戶開始編輯但分散注意力並使瀏覽器保持打開狀態,則對該項目的其他編輯將被阻止,直到鎖定超時。

+0

這很好,但我會設置簽入/簽出或鎖定類型標誌。當user1開始編輯時,在數據庫中設置該標誌到期時間。當用戶2去查看它,而不是編輯按鈕或任何告訴他們「用戶1正在編輯這個文件,它被鎖定,直到$日期/時間或用戶1完成編輯」。在user1s屏幕上,您應該更新鎖定,直到他工作時通過ajax,並在保存/退出/重新發布時釋放它。 – ivanivan

+0

這可行。樂觀的策略使您有機會允許用戶並行進行無衝突的更改。也許兩個用戶正在編輯一個頁面,但他們正在改變不同的部分。您可以允許第一個用戶保存,然後將這些更改導入第二個用戶的編輯器,而第二個用戶仍在對其他部分進行更改。 –

相關問題