You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Actix-Session无法正确赋值问题排查求助

Actix Web Session插入值后读取为空的解决办法

核心问题:缺少会话变更的提交操作

Actix Web的Session在插入、修改数据后,不会自动将变更持久化到Cookie,必须显式调用session.commit().unwrap()完成提交,否则所有修改只会停留在当前请求的内存中,无法被后续请求读取,甚至同一个请求内调用entries()也无法获取到未提交的变更。

你的代码中只执行了session.insert(),但没有提交会话,这是导致entries()返回空的主要原因。

修复步骤

  1. 在插入会话值后添加commit操作
    修改你的业务代码,在两次insert之后调用commit():

    Ok(token) => {
        println!("Received token: {:?}", token);
        println!("Access token: {:?}", token.access_token().secret());
        session
            .insert::<StandardTokenResponse<EmptyExtraTokenFields, BasicTokenType>>(
                "token", token,
            )
            .unwrap();
        session
            .insert::<AuthorizationCode>(
                "auth_code",
                AuthorizationCode::new(query["code"].to_string()),
            )
            .unwrap();
        // 新增:提交会话变更,将数据写入Cookie
        session.commit().unwrap();
        // 后续可以正常读取
        println!("Session entries: {:?}", session.entries());
    }
    
  2. 同一请求内读取未提交的变更:使用get()而非entries()
    如果需要在同一个请求中插入数据后立刻读取,entries()返回的是从Cookie加载的初始会话数据,不会包含未提交的变更。此时应该用session.get::<T>("key")来直接获取内存中的未提交值:

    // 插入后直接读取
    let saved_token = session.get::<StandardTokenResponse<EmptyExtraTokenFields, BasicTokenType>>("token").unwrap();
    println!("Saved token: {:?}", saved_token);
    

其他可能的排查点

  • 确认SessionMiddleware的配置正确性:确保session_secret_key在每个worker进程中正确克隆(你的代码中用了move和clone(),这部分是对的)。
  • 检查Cookie的传递:客户端请求时是否正确携带了Session Cookie,尤其是跨域场景下(你用了Cors::permissive(),这部分应该没问题,但可以用浏览器开发者工具查看Cookie是否被设置)。

内容的提问来源于stack exchange,提问作者João

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 01:55:33