了解websocket会话中的超时

时间:2018-04-23 08:37:24

标签: session websocket spring-websocket httpsession

websocket会话被包装在一个http会话中,因此当http会话超时时,websocket会话也会超时。

但是,当只有第一个呼叫是基于会话cookie的http呼叫时,其余时间它是直接建立的连接, 如果超时,连接如何关闭?

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

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

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

如果注销,会在http会话中调用invalidate,因此会通知所有绑定对象,并且我会获得SessionDisconnectEvent。但是,如果超时,我根本没有任何迹象。 在这种情况下我应该如何终止WS连接?

Stack - spring + sockJS + basic stomp

1 个答案:

答案 0 :(得分:0)

我的观察结果是,在注销的情况下,绑定到http会话的所有websocket会话都不会终止。只有发起注销的人才能获得SessionDisconnectMessage。

如果超时,则根本没有迹象。

为了处理超时,我在客户端收到消息后立即拨打电话,并在此电话上查找401。如果它返回401,我在客户端启动会话关闭。

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