添加正确Cookie后Gatling仍报403 Forbidden错误,求排查指导
问题分析与解决
最直接的问题:Cookie添加时机错误
你的脚本里,第一个GET /请求是在addCookie动作之前执行的,也就是说这个请求根本没有携带你设置的认证Cookie,自然会返回403 Forbidden。
修正后的代码
把addCookie移到请求之前,确保请求发送时Cookie已经被添加到会话中:
package assignment7; import static io.gatling.javaapi.core.CoreDsl.*; import static io.gatling.javaapi.http.HttpDsl.*; import io.gatling.javaapi.core.*; import io.gatling.javaapi.http.*; public class AssignmentSimulation extends Simulation { // http config private HttpProtocolBuilder httpProtocol = http .baseUrl("https://staging.com") .acceptHeader("application/json, text/plain, */*") .acceptEncodingHeader("gzip, deflate, br") .acceptLanguageHeader("en-US,en;q=0.9") .contentTypeHeader("application/json") .userAgentHeader("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.47"); // Scenario definition private ScenarioBuilder scn = scenario("Load Testing") // 先添加Cookie,再执行请求 .exec(addCookie(Cookie("stgoauth", "ZW1haWw6ZGFybGFAa2FsaWJyci5jb20gdXNlcjo=") .withDomain(".staging.com") .withPath("/") .withSecure(true))) .exec(http("Accessing Website") .get("/") .check(status().saveAs("status"))) .exec(session -> { int responseStatus = session.getInt("status"); System.out.println("Response Code: " + responseStatus); return session; }); //load simulation { setUp( scn.injectOpen(atOnceUsers(1)) ).protocols(httpProtocol); } }
其他可能导致403的原因
如果修正时机后仍然报错,检查以下几点:
- Cookie属性缺失:查看浏览器中实际的认证Cookie,是否带有
HttpOnly、SameSite属性。如果有,需要在Gatling的Cookie中补充:Cookie("stgoauth", "xxx") .withDomain(".staging.com") .withPath("/") .withSecure(true) .withHttpOnly(true) // 补充HttpOnly属性 .withSameSite(Cookie.SameSite.Lax) // 根据实际情况设置Lax/Strict/None - Cookie有效性:确认你使用的
stgoauth值是否过期,或者是否需要和其他请求参数(比如CSRF Token)配合使用。有些网站会同时校验Cookie和请求头中的Token。 - 域名/路径匹配:确保Cookie的
domain和path与目标网站的完全一致。比如如果网站的Cookie域名是staging.com而不是.staging.com,就需要调整。 - 请求头完整性:对比浏览器发送的请求头,检查是否遗漏了关键字段(比如
Referer、Origin),有些网站会校验这些字段防止跨站请求。
Gatling中Cookie相关的常见陷阱
- Cookie添加时机:必须在发送请求前添加,否则请求不会携带Cookie。
- HttpOnly Cookie的限制:如果目标网站的Cookie是HttpOnly,Gatling的
addCookie必须显式设置.withHttpOnly(true),否则无法正确模拟浏览器的Cookie行为。 - 会话隔离:每个虚拟用户的Cookie是独立存储在各自的会话中的,不要尝试在全局设置Cookie(除非所有用户共用同一个Cookie)。
- 自动Cookie管理:Gatling默认会自动管理响应中的Cookie,如果是通过登录接口获取Cookie,建议让Gatling自动保存,而不是手动添加,避免遗漏属性。
内容的提问来源于stack exchange,提问作者Darla David
相关产品推荐
相关产品推荐

