【问题标题】:Understanding timeouts in websocket sessions了解 websocket 会话中的超时
【发布时间】:2018-04-23 08:37:24
【问题描述】:

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

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

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

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

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

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

堆栈 - spring + sockJS + 基本 stomp

【问题讨论】:

    标签: session websocket spring-websocket httpsession


    【解决方案1】:

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

    在超时的情况下,根本没有任何指示。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      相关资源
      最近更新 更多