gpt4 book ai didi

javascript - nodejs + WebSockets - 通过消息拒绝连接

转载 作者:IT老高 更新时间:2023-10-28 23:25:05 64 4
gpt4 key购买 nike

当连接的用户过多或从不受支持的域连接时,我想向客户端提供一个有意义的错误,所以...

我写了一些 WebSocket 服务器代码:

var http = require('http');
var httpServer = http.createServer(function (request, response)
{
// i see this if i hit http://localhost:8001/
response.end('go away');
});

httpServer.listen(8001);

// https://github.com/Worlize/WebSocket-Node/wiki/Documentation
var webSocket = require('websocket');
var webSocketServer = new webSocket.server({ 'httpServer': httpServer });

webSocketServer.on('request', function (request)
{
var connection = request.reject(102, 'gtfo');
});

还有一些 WebSocket 客户端代码:

var connection = new WebSocket('ws://127.0.0.1:8001');
connection.onopen = function (openEvent)
{
alert('onopen');
console.log(openEvent);
};
connection.onclose = function (closeEvent)
{
alert('onclose');
console.log(closeEvent);
}
connection.onerror = function (errorEvent)
{
alert('onerror');
console.log(errorEvent);
};
connection.onmessage = function (messageEvent)
{
alert('onmessage');
console.log(messageEvent);
};

我得到的只是 alert('onclose'); 一个 CloseEvent 对象记录到控制台,没有任何我能找到的状态代码或消息。当我通过 ws://localhost:8001 连接时,httpServer 回调没有发挥作用,所以我无法在那里捕捉到它。 RFC建议我应该能够在出现问题时发送除 101 之外的任何状态代码,但 Chrome 在控制台中抛出错误 Unexpected response code: 102。如果我调用 request.reject(101, 'gtfo'),暗示它成功了,我会收到握手错误,正如我所料。

不太确定我还能做什么。现在是不是不可能在 Chrome 的 WebSocket 实现中获得服务器响应?

ETA:与此同时,这是一个非常讨厌的黑客行为,我希望这不是我最终要做的事情。

var connection = request.accept(null, request.origin);
connection.sendUTF('gtfo');
connection.close();

最佳答案

我是 WebSocket-Node 的作者,我也在 GitHub 上发布了对相应问题的回复:https://github.com/Worlize/WebSocket-Node/issues/46

不幸的是,WebSocket 协议(protocol)没有提供任何特定机制来在此阶段拒绝客户端连接时提供关闭代码或原因。拒绝采用 HTTP 响应的形式,其 HTTP 状态类似于 40x 或 50x。规范允许这样做,但没有定义客户端应尝试从此类响应中预测任何特定错误消息的特定方式。

实际上,只有当您拒绝来自不允许来源的用户(即来自另一个网站的人试图在未经许可的情况下将用户连接到您的 websocket 服务器)或用户以其他方式没有权限时,才应在此阶段拒绝连接连接权限(即他们没有登录)。后一种情况应由您网站上的其他代码处理:如果用户未登录,则他们不应尝试连接 websocket 连接。

WebSocket-Node 允许您在此处指定的代码和原因是 HTTP 状态代码(例如 404、500 等)以及包含为非标准“X-WebSocket-Reject-Reason”HTTP 的原因响应中的 header 。在使用数据包嗅探器(例如 WireShark)分析连接时,它非常有用。当以这种方式拒绝连接时,没有任何浏览器可以向客户端 JavaScript 代码提供拒绝代码或原因,因为 WebSocket 规范中没有提供。

关于javascript - nodejs + WebSockets - 通过消息拒绝连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10560591/

64 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com