更改请求标头 SOCKET.IO(无需断开连接和重新连接)

Posted

技术标签:

【中文标题】更改请求标头 SOCKET.IO(无需断开连接和重新连接)【英文标题】:Change request headers SOCKET.IO (without disconnecting and reconnecting) 【发布时间】:2021-05-07 11:46:00 【问题描述】:

我在建立与我的 Socket.IO 服务器的连接时设置请求标头,如下所示:

/* socket io client */
let socketIO = new SocketIO("http://localhost:8080", 
  extraHeaders: 
    accessToken: :"access123",
    refreshToken: "refresh123"
  
);

客户端连接后如何更改header(无需断开重新连接)?

【问题讨论】:

【参考方案1】:

目前您无法在握手后更新标头。根据documentation

您可以在会话期间更新标题,但不会 反映在服务器端(作为 socket.handshake.headers 对象 包含在 Socket.IO 握手期间发送的标头)。

在客户端,您可以在更改 socket.io.opts.extraHeaders 对象时更新标头,但如果您希望更改也反映在服务器上,则需要重新连接客户端。在客户端,您可以使用 client.disconnect().connect() 之类的东西强制重新连接

【讨论】:

好吧,唯一的问题是我的令牌每分钟刷新一次。所以每分钟断开和重新连接套接字,那会稳定吗? 嗯,这取决于您的应用程序有多忙以及您的服务器有多强大。我认为使用extraHeaders 存储身份验证令牌不是一个好主意,因为您将经常刷新它们。查看以下帖子 - "Authenticating socket io connections using JWT"。如果你想实现一些自定义的东西,你可以将每个请求的令牌作为数据参数传递,并在服务器上有逻辑来验证它们和其他将刷新令牌的通道,这取决于你。 我仅使用 JWT 进行身份验证,并得出了将令牌作为数据参数传递的相同结论。但是有没有办法拦截请求并为每个发出的事件附加令牌(如axios 中的拦截器),或者我应该手动将令牌添加到每个事件的数据参数中。像客户端的中间件? 我不确定socket.io-client 中是否集成了这样的功能,但您始终可以将发射封装在一个函数中,在该函数中始终注意将令牌附加到发送的数据中。

以上是关于更改请求标头 SOCKET.IO(无需断开连接和重新连接)的主要内容,如果未能解决你的问题,请参考以下文章

socket.io、netty-socketio、nginx 每分钟断开连接

通过 PHP 连接到 socket.io(nodejs)

Socket.io - 客户端断开连接后手动重新连接

Cors 标头未正确处理(http 请求很好,但 socke.io 连接不正确)

Pubnub Socket.io - 与频道断开连接

断开连接时销毁socket.io连接