Socket.io-client: 基于 Cookie 的粘性会话(重新打开)

创建于 2017-09-28  ·  12评论  ·  资料来源: socketio/socket.io-client

我们的项目由一组nodejs微服务组成,通过socket.io进行通信。 其中一些微服务在亚马逊 ALB 负载均衡器后面运行。 ALB 目标组唯一可用的会话粘性是基于 cookie 的,并且在 http 请求中未指定会话 cookie 时使用循环算法分配连接。

这有效地破坏了在 socket.io 连接建立时发生的握手协议,导致可怕的 xhr 轮询错误 400 响应。

一种解决方法是在客户端中完全禁用 xhr 轮询,并且仅依赖于实际的 websocket。 这在受控环境中是完美的,但在某些服务由第三方开发和托管时不起作用。

还存在另一个 hack,它包括覆盖基本的 require('http').request 函数调用,并发出飞行前请求以获取这些会话 cookie。 然后,进一步的 http 请求将在请求中重新插入 cookie。 充其量,我称之为黑客。

请参阅ALB 粘性会话
对相同功能的另一个请求 #775

Needs documentation

最有用的评论

@AndyGOBrien一种解决方法是先从服务器获取 cookie,然后打开套接字连接,指定extraHeaders.Cookie选项,如下所示:

const socket = io(url, {
  extraHeaders: {
    Cookie: cookiesString
  }
})

文档: https ://github.com/socketio/engine.io-client#nodejs -with-extraheaders

所有12条评论

对此有何更新?

有人解决过这个问题吗?

@AndyGOBrien一种解决方法是先从服务器获取 cookie,然后打开套接字连接,指定extraHeaders.Cookie选项,如下所示:

const socket = io(url, {
  extraHeaders: {
    Cookie: cookiesString
  }
})

文档: https ://github.com/socketio/engine.io-client#nodejs -with-extraheaders

@turpault在握手期间设置了一个io cookie: https ://github.com/socketio/engine.io#methods -1

image

是的,我得到了这个工作。 多谢你们

@AndyGOBrien您是在浏览器中还是在节点中执行此操作? 我可以让它在节点中工作,但在浏览器中我无法设置cookie标头

socket.io-client-v2.1.1目前extraHeaders.Cookie选项仅适用于 NodeJS

2018-08-17 0 49 07

2018-08-17 0 51 46

Webpack 3.11.0 / Mac 10.13.6 / Google Chrome 67.0.3396.87

@AndyGOBrien一种解决方法是先从服务器获取 cookie,然后打开套接字连接,指定extraHeaders.Cookie选项,如下所示:

const socket = io(url, {
  extraHeaders: {
    Cookie: cookiesString
  }
})

文档: https ://github.com/socketio/engine.io-client#nodejs -with-extraheaders

任何工作示例? 谢谢

警告:上述解决方案不处理 AWSALB 超时。 如果套接字在粘性超时(即 24 小时)后尝试重新连接,它将抛出transport error

socket.io-client-v2.1.1目前extraHeaders.Cookie选项仅适用于 NodeJS

2018-08-17 0 49 07

2018-08-17 0 51 46

Webpack 3.11.0 / Mac 10.13.6 / Google Chrome 67.0.3396.87

我遇到了同样的问题。 运气好已经修好了?

@Seldonm @gabmontes @59naga幸运的是,任何人都可以通过 extraHeaders 获得成功的案例吗?
我根本做不到。

这事有进一步更新吗? 有些负载均衡器仅适用于 Cookie 粘性会话,例如 Traefik ......

https://github.com/containous/traefik/issues/1035

此页面是否有帮助?
0 / 5 - 0 等级