今天碰到一个需要在连接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;
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐