如何从 JavaScript WebSocket 客户端向服务器发送自定义标头?

3
我知道没有标准的JS WebSocket API可以做到这一点。我的主要目的是从JS Websocket客户端向服务器发送信息,比如resourceId, routingInfo, auth-token, protocol等。我可以想到以下几种方法,请分享您的想法,是否我的方法可行或者有更好的方法:

  1. 我们可以使用cookie来发送自定义头,并在服务器端检索它们吗?

  2. 我们可以使用Web Storage API将它们存储在浏览器中,并在服务器端检索它们吗?

PS:我正在使用基于Java的服务器。

1个回答

4
假设您所说的是来自浏览器的 webSocket 连接,以下是您传送额外“类似头部”的信息的传统选择。
  1. 您可以将它们编码为初始 URL 上的查询参数,这对除了 auth-token 之外的所有内容都可能很好。
  2. 如果您连接 webSocket 的源与您的网页源相同,则可以将参数放入 cookie 中,并且这些 cookie 将随原始 webSocket 连接请求一起发送,服务器可以在连接请求时检索它们。
  3. 您可以建立一个“有条件”的 webSocket 连接,然后在后续的 webSocket 消息中发送凭据。您必须在服务器上实现安全性,以便“有条件”连接的 webSocket 除了验证自身以外不能执行任何其他操作,并且如果适当的凭证没有及时到达,则应超时连接。
正如您可能已经知道的那样,浏览器与 webSocket 的接口不允许在开始 webSocket 连接的初始 HTTP 请求上使用自定义标头。某些其他类型的客户端可以使用这些自定义标头 - 只是浏览器与 webSocket 连接的接口没有该功能。

我们可以使用 Web Storage API 在浏览器中存储它们并检索它们吗?

您网页中的 JavaScript 可以使用 Web Storage API 在浏览器中存储数据,该数据可以稍后从同一来源的页面中的另一个脚本中检索。该数据对服务器不可用,仅在客户端内部可用。

感谢@jfriend00的及时回复。由于安全问题,我不必将它们作为查询参数发送。 还需要澄清一点,如果我们在Web存储API中设置数据,我们是否也可以在服务器端检索它们? - Rahul
@rahul - 不行。Web Storage API 只是客户端存储。你只能从客户端访问它(它由浏览器存储在本地计算机的文件系统中)。 - jfriend00
1
@rahul - 提醒一下,如果你正在使用SSL来保护你的webSocket连接,那么URL本身(包括查询参数)只有接收服务器才能看到,其他人是看不到的。 - jfriend00
1
另一个选项:4. 拥有一个 GET API,返回一个临时的、仅限一次使用的 WebSocket URL。该 GET API 可以接受任何你想要的 API,然后客户端连接到临时(比如 30 秒)的一次性 URL。有点像授权令牌,但它完全安全地包含在 URL 中并被记录,因为一旦被记录,它就无用了。 - TomW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接