前端創建鏈接時官方提供的構造函數
var aWebSocket = new WebSocket(url, [protocols]);
url:要連接的URL;這應該是WebSocket服務器將響應的URL。
protocols:可選;一個協議字符串或者一個包含協議字符串的數組。這些字符串用于指定子協議,這樣單個服務器可以實現多個WebSocket子協議(例如,您可能希望一臺服務器能夠根據指定的協議(protocol)處理不同類型的交互)。如果不指定協議字符串,則假定為空字符串。
websocket攜帶參數支持兩種方式
在url后面拼接,類似以get請求
var socket = new WebSocket('ws://example.com/socket?token=' + YOUR_TOKEN);
使用protocols,token不要有特殊符號之類,逗號,橫杠等也不要有,要不前端構造函數會報錯
var webSocket = new WebSocket(url,[token]);
后臺獲取
package cn.bool.business.framework.websocket.core.security;import cn.bool.business.framework.security.core.LoginUser;
import cn.bool.business.framework.security.core.filter.TokenAuthenticationFilter;
import cn.bool.business.framework.security.core.util.SecurityFrameworkUtils;
import cn.bool.business.framework.websocket.core.util.WebSocketFrameworkUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.server.HandshakeInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;/**
* 登錄用戶的 {@link HandshakeInterceptor} 實現類
*
* 流程如下:
* 1. 前端連接 websocket 時,會通過Sec-WebSocket-Protocol協議傳輸token
*/
public class LoginUserHandshakeInterceptor implements HandshakeInterceptor {@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,WebSocketHandler wsHandler, Map<String, Object> attributes) {? ? ?//?HttpServletRequest req = ((ServletServerHttpRequest) request).getServletRequest();//?String header = request.getHeader(WS_LOGIN_USER_HEADER);? ? ?// 不強轉也可以使用? ? ?HttpHeaders headers = request.getHeaders();List<String> list = headers.get("Sec-WebSocket-Protocol");if (CollectionUtil.isNotEmpty(list)) {String token = list.get(0);}? ? ?// 自己項目中登錄校驗邏輯 TODOreturn true;}@Overridepublic void afterHandshake(ServerHttpRequest request, ServerHttpResponse response,WebSocketHandler wsHandler, Exception exception) {? ? ? ? ? // 需要將前端自定義協議頭Sec-WebSocket-Protocol原封不動返回回去,否則會報錯HttpServletRequest httpRequest = ((ServletServerHttpRequest) request).getServletRequest();HttpServletResponse httpResponse = ((ServletServerHttpResponse) response).getServletResponse();if (StringUtils.isNotEmpty(httpRequest.getHeader("Sec-WebSocket-Protocol"))) {httpResponse.addHeader("Sec-WebSocket-Protocol", httpRequest.getHeader("Sec-WebSocket-Protocol"));}}}