樹華偉
(大漢軟件股份有限公司 江蘇省南京市 210023)
隨著政府或企業的業務與規模的擴大,政府或企業在管理方面對信息化系統的依賴程度越來越高,對IT 系統的規劃、建設、日常運營與維護、系統安全管理等都有了更高的要求。傳統的辦公管理模式一般通過QQ,Email、微信、釘釘和U 盤等形式進行文檔之間的共享協作,繁復進行文檔的傳輸和信息匯總,這種方式導致工作低效,企業文件分散,缺乏集中管理。而且存在不少隱性的問題,比如可能出現嚴重的信息泄露風險。此時,文檔之間的協作正是解決這些問題的最佳方案,多人一起編輯一份文檔,各改一塊,又能同時看到別人的修改過程,實時文檔協作,保證文檔集中存儲。
我們發現,多人同時編輯更新文檔時容易出現沖突的問題,目前普遍的做法是使用多人在線文檔協同編輯系統,其是指多個用戶同時通過網絡編輯同一份文檔,每一個用戶都可以修改文檔、并實時地看到其他用戶的修改。在線文檔協同編輯系統使多個用戶能夠高效率地協同工作,顯著提高文檔編輯的速度?,F有的典型的在線協同編輯系統有Google Docs、TWiki 系統等。
常用的協同編輯技術有TWiki 系統的編輯鎖技術,Git 等管理軟件的diあ-patch 算法,Google Docs 的Operational Transformation算法。編輯鎖是實現協同編輯最簡單的方法,編輯鎖的方法就是在用戶對某一對象或者區域進行編輯之前首先講這個對象或者區域加鎖,以防止其他用戶同時對這個對象的編輯[1]。采用這種方式雖然可以在一定程度上避免覆蓋問題,但它的使用體驗不好,文檔鎖定的同時其他用戶不能進行編輯操作,需要等用戶編輯完才能解鎖,在協同上具有局限性,并且用戶對文檔的修改是覆蓋性的,即誰最后修改文檔,則成為文檔的最終版本,對中間用戶的修改不可追溯,文檔的可靠性不高。diあ-patch 算法和Operational Transformation 算法[2]技術均是面對同一權限的用戶,即所有用戶均可以實時對文檔進行修改,并不能滿足企業用戶對于修改權限的需求,對于同一文檔的內容,不同崗位的成員或是面向不同階層的用戶,若對文檔具有統一的修改權限,任何人均可修改則會導致文檔的可靠性不高,不能滿足企業文檔分布式管理的需求。
為了解決以上現有技術的不足,提供一種管理方便且能較好解決多端數據更新沖突的方法,同時需要兼顧安全性和可靠性的特點。方法內容如下:
(1)客戶端與服務端之間建立長連接,客戶端通過文本差異算法輸出文檔的差異數據,通過長連接將差異數據傳給服務端,服務端將差異數據更新到文檔,并形成補丁包,同時將補丁包傳至其他客戶端,生成用戶對文檔寫的操作;
(2)客戶端建立文檔數據時在特定位置插入權限標識符,權限標識符對文檔內容進行區塊劃分,并賦予區塊修改權限值,權限標識符記錄區塊位置數據和編輯權限值數據;
(3)客戶端識別用戶的身份權限值,若低于某一區塊的權限標識符的編輯權限值,則相應位置區塊被添加編輯鎖;
(4)具有某一區塊編輯權限的用戶編輯該區塊時,客戶端將該區塊中權限標識符的區塊位置數據發送至服務端,服務端根據區塊位置數據將該區塊的權限標識符的編輯權限值數據進行可逆替換,將權限值替換為一大于用戶最大權限值的數值,同時更新其他客戶端在該區塊的權限標識符數據,其他用戶的這個區塊將被添加編輯鎖;用戶退出該區塊的編輯時,服務端根據區塊位置數據將該區塊的權限標識符的編輯權限值數據進行還原:若用戶未修改該區塊的編輯權限值,則編輯權限值數據還原為原來的值;若用戶修改了該區塊的編輯權限值,則編輯權限值數據還原為用戶修改后的值。
客戶端與服務端之間建立長連接,客戶端通過文本差異算法輸出文檔的差異數據,通過長連接將差異數據傳給服務端,服務端將差異數據更新到文檔,并形成補丁包,同時將補丁包傳至其他客戶端,生成用戶對文檔寫的操作。
客戶端建立文檔數據時在特定位置插入權限標識符,根據權限標識符對文檔內容進行區塊劃分,并賦予區塊修改權限值,不同區塊的內容根據用戶身份具有不同的修改權限;權限標識符記錄區塊位置數據和編輯權限值數據。
用戶編輯時,服務端與客戶端建立WebSocket 長連接(長連接的一種,本次研究采用WebSocket 長連接,可以在瀏覽器和服務器之間建立一條雙向通道,雙方可以通過這個連接自由的傳遞信息[3]),在客戶端建立文檔的可編輯副本;客戶端識別用戶的身份權限值,若低于某一區塊的權限標識符的編輯權限值,則相應位置區塊被添加編輯鎖;用戶對某一區塊編輯時,其他用戶的該區塊添加編輯鎖;用戶退出該區塊的編輯時,其他用戶的該區塊釋放編輯鎖,客戶端記錄用戶對該區塊的修改操作生成修改參數數據,并通過diあ算法(文本差異算法的一種,本次研究采用diあ算法)輸出現有文檔和原文檔的差異數據,通過WebSocket 長連接將修改參數和差異數據傳給服務端,服務端通過patch 技術生成補丁包更新其他用戶的文檔。
服務端通過WebSocket 長連接將修改參數和差異數據傳給其他用戶,更新其他用戶客戶端文檔的可編輯副本,同時顯示修改參數和差異數據記錄的信息。
在文檔編輯過程中,權限標識符至關重要。它主要是記錄區塊位置數據和編輯權限值數據,當用戶打開文檔的可編輯副本時,客戶端通過對比用戶的身份權限值和權限標識符的編輯權限值數據決定用戶對相應區塊的編輯權限,當用戶身份低于權限標識符的權限值時,相應位置的區塊不能編輯,即添加編輯鎖;當任一用戶編輯文檔的某一區塊時,客戶端將該區塊中權限標識符的區塊位置數據發送至服務端,服務端根據區塊位置數據將該區塊的權限標識符的編輯權限值數據進行可逆替換,將權限值替換為一大于用戶最大權限值的數值,同時更新其他客戶端在該區塊的權限標識符數據,其他用戶的這個區塊即被添加編輯鎖;當用戶退出某一區塊的編輯時,客戶端將該區塊的位置信息發送至服務端,該區塊的權限標識符的編輯權限值數據進行還原,同時更新其他客戶端的可編輯副本,其他有修改權限的用戶即釋放編輯鎖。
為了數據的安全,權限標識符以字符串形式記錄,權限標識符數據在客戶端和服務端之間通過SM2 算法進行加密傳輸(加密算法的一種,國密非對稱加密),對于權限標識符在服務端與客戶端的映射,使用密碼運算進行變換和逆變換。
權限標識符還記錄區塊序值數據,服務端對客戶端上傳的權限標識符的區塊序值數據進行遞增運算,避免不同用戶在同一時刻、同一位置進行寫入操作時造成區塊混淆。
用戶修改了區塊的編輯權限值的數值不得大于用戶本身的身份權限值,以免造成用戶自身不得二次修改的困境。
以下列舉實施例來說明用戶對在線文檔的多人協同編輯方法。
現有不同身份權限值的用戶a-f,其中用戶a 不具有編輯權限,具體權限值如表1。

表1:權限值
新生成的空白在線文檔D1 內容為空,任何具有編輯權限的用戶均可對該文檔進行寫的操作。
用戶a 通過客戶端打開文檔D1 時,客戶端建立與服務端的WebSocket 長連接,由于其不具有編輯權限,客戶端識別其身份權限值未賦值,則用戶a 不可編輯文檔D1,不能插入光標,并且用戶a 的客戶端僅實時接收服務端數據,不上傳數據,但用戶a 可實時預覽其他用戶對文檔D1 的編輯過程。
用戶b 通過客戶端打開文檔D1 時,客戶端建立與服務端的WebSocket 長連接,客戶端識別其身份權限值,用戶b 在執行文檔寫的操作開始時,在插入光標時,客戶端就在寫入數據的字符前添加權限標識符數據的函數,待文檔寫入操作結束,記錄用戶b 寫操作的區塊位置數據和編輯權限值數據,生成區塊值為1,權限值為0 的權限標識符數據,隨即該權限標識符數據隨區塊內容數據一起上傳至服務端。服務端接收用戶b 的數據后,通過WebSocket 長連接將數據發送至其他用戶的客戶端實現同步。
用戶c-f 同樣對文檔D1 具有如用戶b 一樣執行寫的操作過程。
文檔D2 具有預先編輯好的內容,包含不同編輯權限值的區塊BL0-BL4,具體權限值如表2。

表2:權限值
用戶a 通過客戶端打開文檔D2 時,客戶端建立與服務端的WebSocket 長連接,由于其不具有編輯權限,客戶端識別其身份權限值未賦值,則用戶a 不可編輯文檔D2,不能插入光標,并且用戶a 的客戶端僅實時接收服務端數據,不上傳數據,但用戶a 可實時預覽其他用戶對文檔D2 的編輯過程。
用戶b 通過客戶端打開文檔D2 時,客戶端建立與服務端的WebSocket 長連接,客戶端識別其身份權限值為0,與文檔D2 各個區塊的編輯權限值進行對比,發現僅有區塊BL0 的編輯權限值等于其身份權限值,所以僅能對區塊BL0 進行編輯,在用戶b 客戶端上的區塊BL1-BL4 具有編輯鎖。
用戶a-f 對區塊BL0-BL4 的編輯權限如表3。

表3:用戶a-f 對區塊BL0-BL4 的編輯權限
用戶b 在編輯區塊BL0 時,客戶端將區塊BL0 中權限標識符的區塊位置數據發送至服務端,服務端根據區塊位置數據將該區塊的權限標識符的編輯權限值數據進行可逆替換,將編輯權限值替換為9,同時更新其他客戶端在該區塊的權限標識符數據,用戶c-f的身份權限值均低于9,則用戶c-f 客戶端上的區塊BL0 也將被添加編輯鎖。
用戶b 編輯完區塊B0 時,客戶端記錄用戶b 對區塊BL0 的修改操作生成修改參數,修改參數包括編輯的用戶、編輯的時間信息等,并通過diあ算法輸出現有文檔和原文檔的差異數據,即用戶b修改操作的內容,通過WebSocket 長連接將修改參數和差異數據傳給服務端,服務端通過patch 技術生成補丁包更新文檔;同時服務端將區塊BL0 的權限標識符的編輯權限值數據還原為0,即釋放編輯鎖,用戶c-f 對該區塊又可再次編輯;服務端更新文檔后,通過WebSocket 長連接將數據發給其他用戶,更新其他客戶端文檔,同時顯示修改參數和差異數據記錄的信息。
根據用戶的權限在編輯不同區塊時,客戶端與服務端的更新邏輯如圖1。

圖1:客戶端與服務端的更新邏輯
值得說明的是:
(1)不具編輯權限的用戶a 雖不具備編輯權限,但可實時預覽文檔編輯過程;
(2)權限標識符的編輯權限值數據是可編輯的,可由用戶自行設定,其最高設定值不高于用戶本身的身份權限值,例如用戶f對文檔D2 進行編輯時,可以將區塊BL4 的編輯權限值修改為3,原先該區塊對用戶e 是不可編輯權限,修改后用戶e 將具備區塊BL4 的編輯權限;
(3)同一用戶在寫操作時,可以通過插入權限標識符來對內容進行區塊劃分,并賦予不同區塊不同的權限值,例如用戶f 對文檔D1 進行寫操作時,可以插入兩個區塊,兩個區塊的具有不同的權限標識符,分別賦予這兩個區塊編輯權限值為4 和編輯權限值為3 的編輯權限。
本次研究的方法,通過對插入權限標識符對文檔進行分區塊劃分,賦予用戶不同的身份權限和文檔不同區塊的編輯權限,使文檔具有多人協同編輯的功能,并且通過編輯鎖技術和文檔差異算法的結合使用,使文檔的編輯更具指向性,滿足文檔分布式管理的需求。