了解 websocket 会话中的超时

Understanding timeouts in websocket sessions

websocket 会话包含在 http 会话中,因此当 http 会话超时时,websocket 会话也会超时。

但是,只有第一次调用是基于会话cookie的http调用,其余时间都是直接建立的连接时, 如果超时,连接如何关闭?

场景 - 我们有一个反向代理来管理会话的验证检查。这意味着它会拦截每个调用并检查会话的有效性。 如果 cookie 已过期,它 returns 401。

因为我已经将 websockets 集成到这个系统中,初始的 websocket 调用通过这个带有有效 cookie 的反向代理,将请求升级到 websocket,然后 一直直接发消息。反向代理不知道这些通过 WS 发送的直接消息。

现在,当 http 会话过期时,对系统进行的其他调用会收到 401。但是上面的 WS 连接根本不知道它并继续发送 send/receive 消息。

在注销的情况下,将在 http 会话上调用无效,因此所有绑定的对象都会收到通知,并且我会收到 SessionDisconnectEvent。但是,在超时的情况下,我根本没有任何指示。 在这种情况下我应该如何终止 WS 连接?

堆栈 - spring + sockJS + 基本 stomp

我的观察是,在注销的情况下,绑定到 http 会话的所有 websocket 会话都不会终止。只有启动注销的那个才能获得 SessionDisconnectMessage。

如果超时,则完全没有任何指示。

为了处理超时,我在客户端收到消息后立即调用服务器,并在此调用中查找 401。如果它 returns 是 401,我会在客户端启动会话关闭。

为了处理注销,我维护了一个包含 http 会话 ID 和所有与之关联的 websocket 会话的映射。当我在任何 websocket 会话上收到断开连接时,我将终止与该 http 会话关联的所有其他 ws 会话。