Phoenix LiveView中live_redirect无法正确获取更新后的session
问题原因
LiveView 的 live_redirect 是在当前持久化的 LiveView 连接内完成跳转,它会复用连接建立时获取的 session 快照,不会重新从服务器拉取最新的 session 数据。而手动跳转或刷新页面会重新发起 HTTP 请求、建立新的 LiveView 连接,此时才能获取到更新后的 session。
解决方法
同步更新 Socket Assigns
在处理时区变更的handle_event中,除了推送事件更新服务器 session,同时把时区值存入 Socket 的 assigns 中,后续页面跳转时直接使用 assigns 里的最新值,无需依赖 session:@impl true def handle_event("changed_timezone", %{"timezone_selected" => timezone_selected}, socket) do # 同步更新socket的assigns socket = assign(socket, :timezone, timezone_selected) {:noreply, push_event(socket, "store", %{key: "timezone", value: timezone_selected})} end之后在
mount函数中优先读取 assigns,无值时再从 session 取:@impl true def mount(_params, session, socket) do timezone = socket.assigns[:timezone] || session["timezone"] {:ok, assign(socket, :timezone, timezone)} end触发 LiveView 连接重连
前端完成 session 更新的请求后,主动断开并重新连接 LiveView,让后续的live_redirect使用新的 session:liveSocket.on("store", (data) => { fetch("/session/set", { method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify({timezone: data.value}) }).then(() => { liveSocket.disconnect(); liveSocket.connect(); }); });改用 live_patch(同 LiveView 路由场景)
如果跳转目标属于同一个 LiveView 的不同路由,使用live_patch会触发handle_params而非重新 mount,此时可以在handle_params中重新读取 session 数据(需结合 session 更新逻辑确保数据最新)。
内容的提问来源于stack exchange,提问作者WilliamG
相关产品推荐
相关产品推荐

