websocket链接携带参数

时间:2025-03-14 15:38:55

前端创建链接时官方提供的构造函数

var aWebSocket = new WebSocket(url, [protocols]);
url:要连接的URL;这应该是WebSocket服务器将响应的URL。
protocols:可选;一个协议字符串或者一个包含协议字符串的数组。这些字符串用于指定子协议,这样单个服务器可以实现多个WebSocket子协议(例如,您可能希望一台服务器能够根据指定的协议(protocol)处理不同类型的交互)。如果不指定协议字符串,则假定为空字符串。

websocket携带参数支持两种方式

在url后面拼接,类似以get请求

var socket = new WebSocket('ws:///socket?token=' + YOUR_TOKEN);

使用protocols,token不要有特殊符号之类,逗号,横杠等也不要有,要不前端构造函数会报错

var webSocket = new WebSocket(url,[token]);

后台获取

package ;

import ;
import ;
import ;
import ;
import .;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;

/**
* 登录用户的 {@link HandshakeInterceptor} 实现类
*
* 流程如下:
* 1. 前端连接 websocket 时,会通过Sec-WebSocket-Protocol协议传输token
*/
public class LoginUserHandshakeInterceptor implements HandshakeInterceptor {

     @Override
     public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
     WebSocketHandler wsHandler, Map<String, Object> attributes) {     // HttpServletRequest req = ((ServletServerHttpRequest) request).getServletRequest();
     // String header = (WS_LOGIN_USER_HEADER);     // 不强转也可以使用     HttpHeaders headers = ();
     List<String> list = ("Sec-WebSocket-Protocol");
     if ((list)) {
          String token = (0);
     }     // 自己项目中登录校验逻辑 TODO
     return true;
     }

     @Override
     public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response,
     WebSocketHandler wsHandler, Exception exception) {          // 需要将前端自定义协议头Sec-WebSocket-Protocol原封不动返回回去,否则会报错
         HttpServletRequest httpRequest = ((ServletServerHttpRequest) request).getServletRequest();
         HttpServletResponse httpResponse = ((ServletServerHttpResponse) response).getServletResponse();
         if ((("Sec-WebSocket-Protocol"))) {
             ("Sec-WebSocket-Protocol", ("Sec-WebSocket-Protocol"));
         }
     }

}