我不會關心問題中概述的解決方案的性能。如果您想關閉以前的連接,則無法維護服務器端地圖。假設一臺服務器和所使用大猩猩的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更新此圖是小的成本握手以及場景中發生的其他一切。
您是否考慮將連接唯一標識符存儲在安全的HTTPOnly Cookie中?如果不存在,發出一個新的,如果它知道他們的連接是什麼。您可以通過依靠瀏覽器以安全的方式維護他的東西來避免維護他的東西。 – evanmcdonnal
我明白你的意思,你會檢查cookie是否存在。但是,我寧願執行服務器端檢查,也很容易刪除該特定的cookie並建立新的連接。 –
您在服務器上進行檢查。這個cookie是HTTPOnly,所以它將被刪除的唯一方式是如果用戶清除他們的cookie,在這種情況下他們的會話可能會被破壞,所以你必須給他們一個新的連接。把HTTPOnly cookie看作是服務器端資源,因爲這實際上就是這樣。你控制它,瀏覽器爲你攜帶它,沒有任何東西可以觸摸它,它是你的存儲。 – evanmcdonnal