连接到不同主机上的 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 的问题。
这是一个您可以用来解决它的方案。
- 客户端第一次建立 webSocket 连接。
- 服务器发回一个包含 sessionID 的 webSocket 消息。
- 客户端将 sessionID 存储在第一方 cookie 中(例如,主机网页中的 cookie)。
- 用户点击刷新。
- 网页检查主机页面的 cookie 中是否有 webSocket 会话 cookie。如果是这样,它将为包含该会话 ID `new Websocket("ws://localhost:3000?session=xyslkfas")
的 webSocket 连接构造一个 URL
- 当服务器接受 webSocket 连接时,它会检查查询参数以查看是否已经指定了一个会话。如果是这样并且该会话仍然有效,它将连接到该会话。如果没有,它会创建一个新会话并返回到步骤 2。
我正在向不同主机上的 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 的问题。
这是一个您可以用来解决它的方案。
- 客户端第一次建立 webSocket 连接。
- 服务器发回一个包含 sessionID 的 webSocket 消息。
- 客户端将 sessionID 存储在第一方 cookie 中(例如,主机网页中的 cookie)。
- 用户点击刷新。
- 网页检查主机页面的 cookie 中是否有 webSocket 会话 cookie。如果是这样,它将为包含该会话 ID `new Websocket("ws://localhost:3000?session=xyslkfas") 的 webSocket 连接构造一个 URL
- 当服务器接受 webSocket 连接时,它会检查查询参数以查看是否已经指定了一个会话。如果是这样并且该会话仍然有效,它将连接到该会话。如果没有,它会创建一个新会话并返回到步骤 2。