理论问题,因为我对这个概念有一个初步的想法,并且还没有任何代码。
假设我将 Websockets 与 Tornado 一起使用,并以桥接方式使用一个处理常规连接的 django 项目。这意味着:实际的服务器是Tornado,它接收每个请求,如果请求没有/socket的路径(比如说),django wsgi处理程序将处理它(通过回退容器)。另一方面,对/socket path 的请求必须具有 ws 或 wss 协议,并被 Tornado 视为 websocket。
当连接开始时,升级之前的第一个请求将具有cookie,我可以从cookie中获取会话ID,并使用会话管理器按ID获取会话对象。对于该连接的失效,由于它是一个 websocket 连接,它将是一个长期连接,我将对会话 id cookie 具有相同的值(因为我无法获取 cookie 标头,因为 websocket 连接不再发送标头 - 这个想法是为了减少开销,并且将 cookie 与消息一起传递可能会产生巨大的开销)。
到目前为止没关系:Websockets 连接,只发送一次 cookie,绑定到该套接字的服务器端可以具有该 cookie 值(会话 ID)并使用它,直到连接关闭。
我的问题:如何实时检测会话不再可用?(可能的原因:1.用户发布了一个涉及关闭当前会话的资源,尽管它是通过AJAX完成的,并且websocket没有关闭;2. 会话因闲置而过期;3. 以某种方式通过使用 Django API 会话被关闭,尽管这并不意味着当前的执行上下文是请求正在关闭 - 我不知道这种情况是否可能)。
注意:检测特定会话何时关闭可以帮助我确定是否也必须关闭相应的 websocket。
我假设你使用的是 django 的 cookie 系统(使用 django.contrib.sessions.middleware.SessionMiddleware
)。
您显然不希望在每个 websocket 请求上每个会话 cookie。然后由服务器来确定会话是否处于活动状态。
这将需要始终访问会话存储。如果您使用的是数据库支持的会话,则会引入大量开销。如果您使用的是缓存支持的会话,这是可行的。
来自 django 文档的参考:https://docs.djangoproject.com/en/1.8/topics/http/sessions/