問題: 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;
}
