网页中建立ws连接时,如果传入了子协议就会提示连接失败,去掉子协议就可以连接成功

gcollar

我想在与GatewayWorker建立连接前对请求连接的来源进行验证,因此在页面中请求连接时传入了token,请求代码如下:

let token = 'abc';
ws = new WebSocket('ws://192.168.0.199:8120', [token]);

服务器端可以通过Sec-WebSocket-Protocol读取到token值,但验证通过后客户端还是提示连接失败,也没有具体的失败原因信息

截图

在网上查了查,似乎是服务器端需要将Sec-WebSocket-Protocol中的内容回写到Response的Header中,我初次使用GatewayWorker,不知道要如何将子协议写入到Response中, 在GatewayWorker官方文档中没有找到相关的信息,哪位朋友知道这个问题要如何处理呢?

2077 3 0
3个回答

小七他哥
  • gcollar 2021-07-14

    谢谢,query传递token的方式我已经调试通过了,只是token的字符串比较长,我想用子协议的形式再试试看,也想把子协议这一块了解的清楚一些。

gcollar

Query传递token的方式已经调试通过了,我想再用子协议的方式试试看,还请知道的朋友指点一下,谢谢

  • 暂无评论
blogdaren
$connection->onWebSocketConnect = function($connection , $http_header){
    if (!empty($_SERVER['HTTP_SEC_WEBSOCKET_PROTOCOL'])) {
        //注意 sub_protocols 根据前端传的是字符串还是数组自行处理下
        $sub_protocols = $_SERVER['HTTP_SEC_WEBSOCKET_PROTOCOL'];
        $connection->headers = [
            'Sec-WebSocket-Protocol: ' . $sub_protocols,
        ];
    }
};
  • gcollar 2021-07-15

    调试通过了,多谢!

  • 雪饮 2022-04-23

    我在GatewayWorker中尝试这样设置(在BusinessWorker中的onGatewayMessage回调中实现):
    if(isset($data["body"])){
    if(isset($data["body"]["server"])){
    if(isset($data["body"]["server"]["HTTP_SEC_WEBSOCKET_PROTOCOL"])){
    //var_dump($data["body"]["server"]["HTTP_SEC_WEBSOCKET_PROTOCOL"]);

                    $sub_protocols = $data["body"]["server"]["HTTP_SEC_WEBSOCKET_PROTOCOL"];
                    $connection->headers = [
                        'Sec-WebSocket-Protocol: '.$sub_protocols,
                    ];
    
                }
            }
        }

    这样做,但是还是没有生效

年代过于久远,无法发表回答
🔝