什麼是防止頁面上多個用戶的最佳方式?一次阻止頁面上的多個用戶
例如,如果用戶在頁面「Home.aspx」,沒有其他的用戶可去那裏。
我使用的服務器和客戶端的JS-frameword的jQuery的asp.net。
什麼是防止頁面上多個用戶的最佳方式?一次阻止頁面上的多個用戶
例如,如果用戶在頁面「Home.aspx」,沒有其他的用戶可去那裏。
我使用的服務器和客戶端的JS-frameword的jQuery的asp.net。
簡單的部分只允許一個用戶訪問一個頁面。例如,您可以將會話ID存儲在應用程序變量中,以跟蹤頁面上的用戶。
困難的部分是要知道用戶何時離開頁面。 HTTP協議只處理請求,所以服務器只知道用戶何時進入頁面。協議中沒有「正在瀏覽」頁面的概念。
可以使用onunload
事件在客戶端代碼,當用戶去別的地方趕,但是這並不總是可行的。如果用戶失去了互聯網連接,則無法與用戶離開該頁面的服務器進行通信。如果瀏覽器或電腦崩潰,自然不會有onunload
事件。
您可以通過例如重新加載頁面上的圖像來向服務器請求數據。這樣服務器就可以知道用戶是否仍然以特定的時間間隔在頁面上。但是,如果用戶失去互聯網連接,服務器會認爲用戶已經離開,而用戶認爲他/她仍然在網頁上。
另一個問題是瀏覽器歷史記錄和緩存。用戶可能會離開該頁面,然後再返回該頁面。您必須確保頁面沒有被緩存,否則瀏覽器將只使用緩存頁面,並且服務器不知道用戶認爲他/她再次在頁面上。
不知道爲什麼你會這麼做,因爲它在網頁可用性方面飛速發展。您可以在服務器端代碼的每個頁面上執行鎖定機制(寫入用戶名,頁面和時間到數據庫),當它們轉到另一頁面時會自動釋放。然後,您將檢查頁面加載事件,以確定當前是否有人將該頁面鎖定。然而,這是一個很大的問題 - 你是否考慮過如果有人關閉瀏覽器或走開並將其留在頁面上會發生什麼。你需要認真考慮超時釋放鎖。這需要作爲後臺服務,無論是在global.asax中作爲全局代碼還是單獨的進程。
也許使用靜態變量來保存第一個用戶訪問該頁面,然後檢查其他請求是否來自同一個IP的IP地址,否則顯示「無法訪問」頁面。
確保您使用鎖定:
Object thisLock = new Object();
lock (thisLock)
{
// access static variables
}
您還應該使用「Session_End中」的方法在Global.asax中去除的情況下,在用戶離開你的網站,而無需按註銷按鈕
這假定所有請求都由同一臺服務器上的一個進程處理。這在生產服務器上通常是無效的假設。 – 2010-08-28 08:57:18
你是對的,但我認爲在這種情況下,我可以假設他沒有多個處理器的服務器。如果他確實有,那麼我會建議將IP存儲在服務器端的文本文件中 - 我個人不會使用數據庫來處理這樣的任務(再次,我假設他不使用數據庫)! – Mouhannad 2010-08-28 09:18:37
與Guffa同意,你不能肯定的是,瀏覽器已經在頁面上還是不行,你只能檢查瀏覽器是否已經連接到該網頁或沒有。
你可以做一種「平」,但它更多的是技巧不是100%的工作解決方案,它需要啓用JavaScript。
我沒有這樣做,但我應該看的XMLHTTPRequest和onreadystatechange的來處理這個:
1)在頁面加載時,瀏覽器(客戶端)主動與網站(服務器一個XMLHttpRequest),然後等待使用onreadystatechange事件回調。
2)網站收到請求並用當前的DateTime.Now「標記」該頁面爲「正在使用中」。
3)然後網站發送響應。
4)onreadystatechange事件獲取響應,並且事件代碼重新請求服務器在1分鐘後重新啓動2。 5)如果另一個客戶端請求該頁面,則服務器檢查DateTime標記:如果該標記大於1分鐘前,這意味着客戶端沒有響應該請求,並且可能不再在該頁面上。
這是我正在考慮的方式。我唯一擔心的是如果腳本停止工作。但是,如果它帶有setTimeOut的簡單腳本應該沒有問題。 – Andreas 2010-08-28 17:07:07
@Andreas:即使一個簡單的腳本現在也不能聯繫到服務器,所以你也需要一個處理這種情況的計劃。 – Guffa 2010-08-28 18:17:32
好的一點是,最好對服務器進行多次檢查,以確保它能夠及時與服務器聯繫。 – Andreas 2010-08-29 13:31:08