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

使用Gatling的addCookie无法设置正确的认证Cookie

问题根源

  1. Cookie名称错误:你在Gatling中构造Cookie时用了"set-cookie"作为Cookie名称,但set-cookie是响应头的名称,实际的Cookie名称应该是从该头内容里提取的(比如JSESSIONID、auth_token这类标识)。
  2. Set-Cookie头解析不完整:你直接把整个Set-Cookie头内容(包括Optional包装)作为Cookie值,没有正确拆分出Cookie的名称、值以及必要属性(如Path、HttpOnly等),导致Gatling无法正确携带Cookie发起请求。

修复步骤

1. 修正getAuthCookie方法,正确解析Set-Cookie头

修改方法,解析Set-Cookie字符串,提取Cookie的名称、值和关键属性:

// 自定义类存储Cookie信息
static class CookieInfo {
    private final String name;
    private final String value;
    private final String path;
    private final String domain;

    public CookieInfo(String name, String value, String path, String domain) {
        this.name = name;
        this.value = value;
        this.path = path;
        this.domain = domain;
    }

    // getter方法
    public String getName() { return name; }
    public String getValue() { return value; }
    public String getPath() { return path; }
    public String getDomain() { return domain; }
}

public CookieInfo getAuthCookie() throws Exception {
    Properties prop = new Properties();
    prop.load(new FileInputStream("data.properties"));
    String user = prop.getProperty("username");
    String pass = prop.getProperty("password");
    String url = prop.getProperty("url");

    Map<Object, Object> data = new HashMap<>();
    data.put("username", user);
    data.put("password", pass);

    HttpRequest request2 = HttpRequest.newBuilder()
            .POST(buildFormDataFromMap(data))
            .uri(URI.create(url))
            .setHeader("User-Agent", "Java 11 HttpClient Bot")
            .header("Content-Type", "application/x-www-form-urlencoded")
            .build();
    HttpResponse<String> response = httpClient.send(request2, HttpResponse.BodyHandlers.ofString());

    // 正确处理Optional,获取Set-Cookie头内容
    Optional<String> setCookieOpt = response.headers().firstValue("set-cookie");
    if (!setCookieOpt.isPresent()) {
        throw new Exception("登录响应未返回Set-Cookie头");
    }
    String setCookie = setCookieOpt.get();

    // 解析Set-Cookie字符串,拆分出名称、值和属性
    String[] cookieParts = setCookie.split(";\\s*");
    String nameValuePair = cookieParts[0];
    String[] nameValue = nameValuePair.split("=", 2);
    String cookieName = nameValue[0];
    String cookieValue = nameValue[1];

    // 提取Path属性,默认根路径,也可从cookieParts中解析
    String path = "/";
    for (String part : cookieParts) {
        if (part.startsWith("Path=")) {
            path = part.substring(5);
            break;
        }
    }

    return new CookieInfo(cookieName, cookieValue, path, "localhost");
}

2. 修正Gatling测试中的Cookie添加逻辑

使用解析后的正确Cookie名称和值,同时确保Path、Domain等属性与登录时一致:

ChainBuilder search;

{
    try {
        CookieInfo cookieInfo = authCookie.getAuthCookie();
        
        search = exec(flushCookieJar())
                .exec(flushHttpCache())
                // 用正确的Cookie参数构造对象,匹配登录返回的属性
                .exec(addCookie(
                        Cookie(cookieInfo.getName(), cookieInfo.getValue())
                                .withDomain(cookieInfo.getDomain())
                                .withPath(cookieInfo.getPath())
                                // 如果登录返回的Cookie带有HttpOnly标记,添加以下配置
                                // .withHttpOnly(true)
                ))
                .pause(1)
                .exec(
                        http("Contacts")
                                .get("/transactions/contacts")
                                .check(status().is(200).saveAs("Response"))
                                // 可选:验证请求是否携带了正确的Cookie
                                // .check(header("Cookie").contains(cookieInfo.getName()))
                )
                .exec(session -> {
                    System.out.println("session1: " + session);
                    return session;
                })
                // flushSessionCookies放在测试流程末尾,避免提前清除Cookie
                .pause(1)
                .exec(flushSessionCookies());
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

3. 额外验证点

  • 对比内部登录时的Cookie:在原来的内部登录测试中打印session里的Cookie,查看名称、Path、HttpOnly等属性,确保手动添加的Cookie和自动保存的完全一致。
  • 检查请求头:通过Gatling日志或请求检查,确认GET请求的Cookie头包含了正确的键值对。

内容的提问来源于stack exchange,提问作者DaSki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:25:28