websocket链接携带参数

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

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

websocket携带参数支持两种方式

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

javascript 复制代码
var socket = new WebSocket('ws://example.com/socket?token=' + YOUR_TOKEN);

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

javascript 复制代码
var webSocket = new WebSocket(url,[token]);

后台获取

java 复制代码
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 {

     @Override
     public 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);
     }     // 自己项目中登录校验逻辑 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 (StringUtils.isNotEmpty(httpRequest.getHeader("Sec-WebSocket-Protocol"))) {
             httpResponse.addHeader("Sec-WebSocket-Protocol", httpRequest.getHeader("Sec-WebSocket-Protocol"));
         }
     }

}
相关推荐
只吃不吃香菜2 小时前
Windows 下基于 YAML 规则的指定域名分流:以哔哩哔哩为例
网络·网络协议·计算机网络·网络安全·代理模式
zt1985q19 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源
老赵的博客1 天前
工控机之UDP组播
网络·网络协议·udp
微硬创新1 天前
耐达讯自动化:16路4-20mA模拟信号,该怎样平稳接入PROFINET控制系统?
人工智能·物联网·网络协议·自动化·信息与通信
麦烤楽鸡翅1 天前
计算机网络基础且重要芝士
网络·网络协议·计算机网络·面试算法题·无耻之徒
小疆智控1 天前
工业跨网通讯实践EtherCAT转TCPIP网关关键技术
网络·网络协议
乱七八糟的屋子1 天前
libnice 超完整使用教程|C语言ICE/P2P公网穿透入门到高阶实战
网络协议·内网穿透·p2p·libnice·ice协议·stun/turn·webrtc底层
zhao3266857511 天前
除了网页浏览,HTTP和HTTPS代理还能干啥?适用场景有哪些
网络协议·http·https
m0_749492221 天前
化工反应釜维护作业口罩选型方案
人工智能·网络协议
caimouse2 天前
TDI (传输驱动接口 Transport Driver Interface) 详细分析
网络协议