如何使用JavaScript从被拒绝的WebSocket打开握手中读取状态代码?

如何使用JavaScript从被拒绝的WebSocket打开握手中读取状态代码?,javascript,websocket,Javascript,Websocket,我用JavaScript创建了一个WebSocket客户端 if ("WebSocket" in window) { ws = new WebSocket(url); ws.binaryType = "arraybuffer"; } else if ("MozWebSocket" in window) { ws = new MozWebSocket(url); ws.binaryType = "arraybuffer";

我用JavaScript创建了一个WebSocket客户端

if ("WebSocket" in window) {            
    ws = new WebSocket(url);
    ws.binaryType = "arraybuffer";      
} else if ("MozWebSocket" in window) {  
    ws = new MozWebSocket(url);
    ws.binaryType = "arraybuffer";  
}
和WebSocket服务器应用程序。在某些情况下,我将服务器编程为拒绝连接请求并提供错误代码

例如,在Firefox控制台中,会显示一条消息

Firefox can't establish a connection to the server at ws://123.123.123.123:1234/.
它提供了状态代码

HTTP/1.1 403 
这是我的WebSocket服务器发送的错误代码

我的问题是:如何在JavaScript客户端中读取此状态代码

ws.onerror = function(e) {
    console.log(e);     
};   
ws.onclose = function(e) {
    console.log(e); 
};

都被调用,但没有一个事件对象包含此错误代码。

规范禁止从WebSocket对象读取HTTP状态代码(或类似代码),因为否则WebSocket对象可用于探测非WebSocket端点,这将是一个安全问题:

用户代理不得以允许脚本区分以下情况的方式向脚本传递任何故障信息:

  • 无法解析其主机名的服务器
  • 无法将数据包成功路由到的服务器
  • 拒绝在指定端口上连接的服务器
  • 无法正确执行TLS握手的服务器(例如,无法验证服务器证书)
  • 未完成开始握手的服务器(例如,因为它不是WebSocket服务器)。
  • 一种WebSocket服务器,它发送了正确的开始握手,但指定了导致客户端断开连接的选项(例如,服务器指定了客户端不提供的子程序)
  • 成功完成开始握手后突然关闭连接的WebSocket服务器
-


不过还有另一种方法

WebSocket协议允许自定义关闭代码:

4000-4999

4000-4999范围内的状态代码保留供私人使用,因此无法注册。此类代码可由WebSocket应用程序之间的事先协议使用。本协议未定义这些代码的解释

-

在服务器端逻辑中,即使您最终想要拒绝连接(比如说用户当前未经身份验证),也要这样做:

  • 接受WebSocket连接
  • 立即以自定义关闭状态关闭连接
  • 客户端现在可以查看以了解连接被拒绝的原因


    不必每次服务器想要拒绝WebSocket连接时都这样做。例如,如果请求不是正确的WebSocket请求,或者出于安全原因(例如,如果源代码检查失败),我仍然会拒绝4xx HTTP状态的连接。您只需要在希望客户端逻辑处理的情况下使用WebSocket关闭状态。

    您想要非http协议中的http错误代码吗?我发现这种方法可以在建立WebSocket连接之前将错误代码从服务器传递到客户端,并且希望错误代码出现在我的JavaScript程序中,而不仅仅是在Firefox控制台。不知道,这是否可能。我不熟悉WebSocket和JavaScript,所以如果这是一个愚蠢的想法,也请告诉我。我认为你只能依赖标准的cookie cutter错误代码,如我尝试了两个标准错误代码(1003:CLOSE_UNSUPPORTED,4001:Available for the use by Application)中所列,并且完全相同。我认为我使用的错误代码并不重要。