WebSocket JS 的自定义标头

Posted

技术标签:

【中文标题】WebSocket JS 的自定义标头【英文标题】:Custom headers for WebSocket JS 【发布时间】:2017-02-12 16:07:31 【问题描述】:

我找到了一个简单的解决方案,将 WebSocket 与基于 php 作为后端和 js+vuejs 作为前端的 Web 应用程序的自定义标头一起使用。

我的应用程序应该连接到基于 Java 的 WebSocket 服务器以获取实时统计信息。受 Oauth2 保护的 WebSocket 服务器。所以我的应用应该添加像

这样的标题

“授权:承载647d14-b132-41b9-aa4c-9eafad5d9630”

当连接到 WS 服务器时。但我无法添加此标头,因为浏览器不支持自定义标头。回答关于自定义标题的问题HTTP headers in Websockets client API

我需要类似下面的代码

var serverWs = "ws://servername/stat"; var opts =  reconnection: false, transports: ['websocket'], extraHeaders:  'Authorization': 'Bearer xxxx'   var ws = new WebSocket(serverWs, opts);

有什么解决办法?

【问题讨论】:

【参考方案1】:

我对 websocket 和标头的大量错误信息感到非常困惑。有一种方法可以将标头添加到 WebSocket 连接。

这样

options.headers= "header1":"value"
const socket = new WebSocket('wss://yourwebsocketAPIpath', [],options )

【讨论】:

@bhargav-rao 如果这最初是一个问题,那么在编辑后它现在完全具有误导性。 WebSocket API 中没有“选项”参数。 这不是问题。这是一个声明。 websocket 绝对有一个选项字段。去试试看。我目前用于 AWS websocket 的授权。将授权详细信息放在上面指定的选项中是通过授权的唯一方法,因为 Websocket js 对象会自动启动连接。 @user1999304 但是这是一个错误的陈述。 the spec 清楚地表明没有第三个参数来设置任何选项。也许您指的是第三方库而不是 WebSocket 网络标准? @user1999304 你是对的!!!!谢谢你。它不在规格中,但确实如此。我用它通过 wss 协议将身份验证标头从反应原生 ios 应用程序传递给 aws。 只需在浏览器的控制台中运行以下命令并检查请求及其标头的网络选项卡; new WebSocket('wss://echo.websocket.org', [], headers: 'My-Header': 'MyValue' );你会发现它不起作用。【参考方案2】:

Websocket 客户端 API 不允许发送自定义标头,它们允许您只设置一个标头,即 Sec-WebSocket-Protocol,即应用程序特定的子协议。您可以使用此标头来传递不记名令牌。

其他选项是在查询字符串中使用标记。

或者您可以在客户端或服务器上使用一些支持自定义标头实现的库,例如。 https://github.com/crossbario/autobahn-python/tree/master/examples/twisted/websocket/echo_httpheaders

【讨论】:

以上是关于WebSocket JS 的自定义标头的主要内容,如果未能解决你的问题,请参考以下文章

将自定义标头设置为 websocket 请求 (ktor)

Heroku Node.js WebSocket 服务器错误:“连接”标头值不是“升级”:升级

Java websocket在onOpen函数中获取自定义标头

从 C# 程序连接基于 node.js 的 socket.io WebSocket 服务器

UIActivityViewController 的自定义标头

如何编写一个 websocket 客户端