连接到不同主机上的 API 时没有持久性 session

No persistent session when connecting to API on different host

我正在向不同主机上的 API 服务器发送一个 websocket 连接:

new WebSocket("ws://localhost:3000")

而我的前端托管在 localhost:8080

在我的 API 的 websocket 连接处理程序中,我可以在 session 上设置一个键(使用 Sinatra 的 enable :sessions)但是每次我刷新 html 页面,数据丢失。

session是否有前端与服务器共享同一主机的要求?或者有什么办法可以解决这个问题?顺便说一下,前端是 Webpack 服务器(节点)上的 运行。

我还尝试为 API 的根路由 http://localhost:3000 添加 cross_origin 容限,然后在客户端中执行此操作(此示例在 coffeescript 中):

$.get "http://localhost:3000", ->
  new Websocket("ws://localhost:3000")

我的想法是 session 可能需要 "initialized" 而不是 http:// 而不是 ws:// 但它也不起作用。 session 也不适用于 $.get "http://localhost:3000" 请求。刷新页面显示 session 每次都清除。

正如我们在评论中讨论的那样,您可能在浏览器中遇到第 3 方会话 cookie 的问题。

这是一个您可以用来解决它的方案。

  1. 客户端第一次建立 webSocket 连接。
  2. 服务器发回一个包含 sessionID 的 webSocket 消息。
  3. 客户端将 sessionID 存储在第一方 cookie 中(例如,主机网页中的 cookie)。
  4. 用户点击刷新。
  5. 网页检查主机页面的 cookie 中是否有 webSocket 会话 cookie。如果是这样,它将为包含该会话 ID `new Websocket("ws://localhost:3000?session=xyslkfas")
  6. 的 webSocket 连接构造一个 URL
  7. 当服务器接受 webSocket 连接时,它会检查查询参数以查看是否已经指定了一个会话。如果是这样并且该会话仍然有效,它将连接到该会话。如果没有,它会创建一个新会话并返回到步骤 2。