WebSocket之Sec-WebSocket-Protocol (帶token發起連接)


問題: ws連接是無法像http一樣完全自主定義請求頭的,給token認證帶來了不便

先看WebScoket構造函數官方文檔

var aWebSocket = new WebSocket(url [, protocols]);
url
要連接的URL;這應該是WebSocket服務器將響應的URL。
protocols 可選
一個協議字符串或者一個包含協議字符串的數組。這些字符串用於指定子協議,這樣單個服務器可以實現多個WebSocket子協議(例如,您可能希望一台服務器能夠根據指定的協議(protocol)處理不同類型的交互)。如果不指定協議字符串,則假定為空字符串。

protocols對應的就是發起ws連接時, 攜帶在請求頭中的Sec-WebSocket-Protocol屬性, 服務端可以獲取到此屬性的值用於通信邏輯(即通信子協議,當然用來進行token認證也是完全沒問題的)

代碼示例

//前端
var aWebSocket = new WebSocket(url ['用戶token']);

//后端
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
     //這里就是我們所提交的token
     String submitedToken=session.getHandshakeHeaders().get("sec-websocket-protocol").get(0);

     //根據token取得登錄用戶信息(業務邏輯根據你自己的來處理)
}

另外,如果需要在第一次握手前的時候就取得token,只需要在header里面取得就可以啦

@Override
public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
        System.out.println("准備握手");
        String submitedToken = serverHttpRequest.getHeaders().get("sec-websocket-protocol")
        return true;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM