使用Gatling的addCookie无法设置正确的认证Cookie
问题根源
- Cookie名称错误:你在Gatling中构造Cookie时用了
"set-cookie"作为Cookie名称,但set-cookie是响应头的名称,实际的Cookie名称应该是从该头内容里提取的(比如JSESSIONID、auth_token这类标识)。 - 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
相关产品推荐
相关产品推荐

