2017-07-21 49 views
3

有辦法讓客戶端上的相同socket.io連接,如果用戶打開一個新頁面或刷新頁面,可能存儲在會話插座或者這是不可能的?Socket.io保持對客戶端連接時,客戶端刷新或打開新的一頁

+0

抱歉,我有一個問題,導致客戶端每次連接到我的socket.io他得到一個新socket.id,我想,以確定用戶發送消息僅從該客戶所有打開的連接時間,所以我搜索一下,我可以用socket.io房間解決我的問題 – John

+1

這是正確的。每個新連接都會獲得一個新ID。如果你想要一個持久的引用來標識一個用戶,你應該在新連接時使用一個在'socket.request.headers.cookie'中可用的cookie,並且你可以使用socket.io中間件來設置一個cookie不存在。或者,您可以使用諸如express-session之類的更常規的持久會話,然後再從socket.io訪問它。 – jfriend00

回答

3

這是不可能的。頁面更改或刷新時,不能保持相同的socket.io或webSocket客戶端連接。瀏覽器根本就沒有這樣做。當加載新頁面或刷新當前頁面時,前一頁中的所有資源都將被瀏覽器關閉並釋放,包括socket.io/webSocket連接。

所以,你的服務器有期待新加載的頁面新socket.io連接。如果您使用cookie或服務器端會話對象,則可以在服務器上識別何時從先前看到的客戶端連接到服務器,然後服務器可以相應地採取行動,以便意識到這只是以前的客戶端重新連接在新的頁面上。

+0

爲什麼downvote?如果你認爲這是錯誤的,那麼請將主機頁面更改爲其他頁面時,確保如何保持socket.io連接處於打開狀態。 – jfriend00

+0

以下內容如何:在客戶端上存儲cookie並在服務器上存儲曾連接到應用程序的客戶端對象列表。在客戶端的連接事件中,檢查cookie值是否在瀏覽器中設置,以及之前連接的客戶端是哪個。由於重放攻擊,這對於真實世界的實現可能是一個問題,但取決於系統應該做什麼,它仍然是一個可行的解決方案。沒有? – FedericoCapaldo

+1

@FedericoCapaldo - 您的Cookie方案通常稱爲會話,並且是大多數服務器如何從一個頁面跟蹤客戶端 - 這就是Cookie的用途。它可用於常規的http請求或傳入的webSocket請求(所有webSocket連接都以http請求開始,因此它們在連接時獲取cookie)。如果您使用express與node.js,那麼會有快速會話模塊爲您執行大量的會話管理工作,並創建這些會話的列表並自動將它們與每個基於Cookie的傳入連接關聯。 – jfriend00

相關問題