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

ESP32 AsyncWebServer多Cookie设置异常:仅第二个Cookie生效

ESPAsyncWebServer v3.6.2 设置多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:27:10