更改请求标头 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 每分钟断开连接