Actix-Session无法正确赋值问题排查求助
Actix Web Session插入值后读取为空的解决办法
核心问题:缺少会话变更的提交操作
Actix Web的Session在插入、修改数据后,不会自动将变更持久化到Cookie,必须显式调用session.commit().unwrap()完成提交,否则所有修改只会停留在当前请求的内存中,无法被后续请求读取,甚至同一个请求内调用entries()也无法获取到未提交的变更。
你的代码中只执行了session.insert(),但没有提交会话,这是导致entries()返回空的主要原因。
修复步骤
在插入会话值后添加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()); }同一请求内读取未提交的变更:使用
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
相关产品推荐
相关产品推荐

