2015-10-28 40 views
0

我有一個網頁,建立與服務器的websocket連接。我必須確保該網站的用戶只能建立一個連接,因此打開一個新標籤並導航到同一頁面將關閉以前的連接。爲每個客戶端強制實施一個獨特的websocket連接?

我正在考慮以會話ID爲關鍵字維護一張地圖,但是,由於越來越多的客戶端連接時地圖的大小必須不斷調整,所以我擔心它會出現性能問題,並且由於它同時訪問,您可能需要進行某種鎖定。

性能的任何想法有效的方法來確保每個客戶端的獨特連接?很想聽聽建議,謝謝。

+0

您是否考慮將連接唯一標識符存儲在安全的HTTPOnly Cookie中?如果不存在,發出一個新的,如果它知道他們的連接是什麼。您可以通過依靠瀏覽器以安全的方式維護他的東西來避免維護他的東西。 – evanmcdonnal

+0

我明白你的意思,你會檢查cookie是否存在。但是,我寧願執行服務器端檢查,也很容易刪除該特定的cookie並建立新的連接。 –

+1

您在服務器上進行檢查。這個cookie是HTTPOnly,所以它將被刪除的唯一方式是如果用戶清除他們的cookie,在這種情況下他們的會話可能會被破壞,所以你必須給他們一個新的連接。把HTTPOnly cookie看作是服務器端資源,因爲這實際上就是這樣。你控制它,瀏覽器爲你攜帶它,沒有任何東西可以觸摸它,它是你的存儲。 – evanmcdonnal

回答

1

我不會關心問題中概述的解決方案的性能。如果您想關閉以前的連接,則無法維護服務器端地圖。假設一臺服務器和所使用大猩猩的WebSocket包,下面的代碼應達到目的:

var (
    mu sync.Mutex 
    conns map[string]*websocket.Conn 
) 

func addConn(sessionID string, conn *websocket.Conn) { 
    mu.Lock() 
    prev := conns[sessionID] 
    conns[sessionID] = conn 
    mu.Unlock() 
    if prev != nil { 
     // Close will stop concurrent reads and writes. 
     prev.Close() 
    } 
} 

func removeConn(sessionID string, conn *websocket.Conn) { 
    mu.Lock() 
    // We don't simply delete(conns, session) to avoid race on cleanup. 
    if conns[sessionID] == conn { 
     delete(conns, sessionID) 
    } 
    mu.Unlock() 
} 

相比於接受傳入的網絡連接的成本,完成的WebSocket更新此圖是小的成本握手以及場景中發生的其他一切。

相關問題