ESP32 AsyncWebServer多Cookie设置异常:仅第二个Cookie生效
问题代码
void handleLogin(AsyncWebServerRequest *request){ String sessionId = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; String role = "admin"; // 创建JSON响应 DynamicJsonDocument jsonDoc(256); jsonDoc["message"] = "welcome"; jsonDoc["type"] = "success"; jsonDoc["redirect"] = "/"; String jsonStr; serializeJson(jsonDoc, jsonStr); // 创建响应对象并添加Cookie AsyncWebServerResponse *response = request->beginResponse(200, "application/json", jsonStr); String expires = generateExpirationDate(SESSION_TIMEOUT); response->addHeader("Set-Cookie", "ESPSESSIONID=" + sessionId + "; Path=/; HttpOnly; Expires=" + expires); response->addHeader("Set-Cookie", "UserRole=" + role + "; Path=/; Expires=" + expires); request->send(response); // 发送包含Cookie的响应 }
问题描述
使用ESP32Async/ESPAsyncWebServer v3.6.2版本,在上述handleLogin接口中设置两个Cookie,但浏览器始终仅识别第二个Cookie,调换Set-Cookie头顺序后第一个仍被忽略。
已完成的排查操作:
- 移除HttpOnly属性;
- 检查网络响应与应用存储,确认仅第二个Cookie生效;
- 将jsonStr替换为空JSON对象({});
- 在Edge、Chrome浏览器测试;
问题仍未解决。
解决方案
这个问题是ESPAsyncWebServer v3.6.2版本的已知缺陷:调用addHeader添加同名响应头时,新的头会直接覆盖旧的,而非按HTTP协议要求追加。
方法1:手动拼接多个Cookie到同一个Set-Cookie头
无需修改库源码,直接将两个Cookie用逗号分隔后添加到同一个Set-Cookie头中:
String cookieHeader = "ESPSESSIONID=" + sessionId + "; Path=/; HttpOnly; Expires=" + expires + ", " + "UserRole=" + role + "; Path=/; Expires=" + expires; response->addHeader("Set-Cookie", cookieHeader);
方法2:修改库源码支持追加同名头
找到库文件AsyncWebServerResponse.cpp中的addHeader方法,将原覆盖逻辑改为追加逻辑:
原代码:
void AsyncWebServerResponse::addHeader(const String& name, const String& value){ _headers[name] = value; }
修改为:
void AsyncWebServerResponse::addHeader(const String& name, const String& value){ if(_headers.find(name) != _headers.end()){ _headers[name] += ", " + value; } else { _headers[name] = value; } }
修改后重新编译上传即可。
内容的提问来源于stack exchange,提问作者Amin Mashayekhan
相关产品推荐
相关产品推荐

