今天碰到一个需要在连接websocket服务时提交token的业务场景,无奈websocket不支持同时提交header,翻阅官方文档时候发现了可以携带一个自定义协议,我们可以通过将token存放在自定义协议中达到提交token的目的。
根据文档,我们调整下代码:
//请务必注意,协议提交的是一个字符串数组类型。
var socket = new WebSocket('wss://url',['用户的token']);
好,这样我们的前端改造就完成了,简单吧~。
接下来就是后端的取值了,先交代下我的后端技术框架,我使用的是SpingCloud 微服务架构,网关使用的是gateway。
/**
* 链接创建
*
* @param session
* @throws Exception
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
//这里就是我们所提交的token
String submitedToken=session.getHandshakeHeaders().get("sec-websocket-protocol").get(0);
//根据token取得登录用户信息(业务逻辑根据你自己的来处理)
}
这样就取到了所提交的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;
}