Cookie Gatling的Cookie管理机制兼具自动处理和精细手动控制能力。主要是CookieJar,会自动存储和发送符合domain和path规则的Cookie,而addCookie、getCookie(更准确的方法是getCookieValue)和flushSessionCookies等方法会用于高级场景的干预。
自动管理和CookieJar
Gatling默认启用Cookie支持。服务器返回的Set-Cookie头会被自动存入虚拟用户会话的CookieJar中。在后续发送请求时,只要请求的域名、路径等属性匹配,对应的Cookie就会自动附加到请求头里,无需手动干预。
主要操作方法
当你需要突破自动管理的限制时(例如预置Cookie、跨域使用或主动清除),就需要用到以下手动方法。
addCookie:预置或覆盖Cookie
此方法用于在发送请求前,向当前会话的CookieJar中手动添加或覆盖一个Cookie。这常用于模拟已登录状态,或测试依赖特定Cookie值的接口。
方法:addCookie(Cookie(name, value))
示例:在访问购物车前,预置一个用户标识 Cookie。
scala
exec(addCookie(Cookie("session_id", "预置的会话值")))
.exec(http("访问购物车")
.get("/cart"))
重点:手动添加的Cookie和服务器返回的Cookie具有同等效力,也会被自动发送到匹配的请求中。
getCookieValue:精准提取Cookie值
此方法用于从 CookieJar 中提取指定 Cookie 的值,以便存入会话变量、在请求体或URL中使用。
方法:getCookieValue(CookieKey("cookie_name"))
示例:提取名为 user_token 的 Cookie 值,并将其用作查询参数。
scala
exec(http("获取Token页")
.get("/token")
)
.exec(
http("使用Token的API")
.get("/api/data")
.queryParam("auth", "${user_token}") // 使用提取的值
)
提示:根据RFC 6265标准,getCookieValue的匹配规则很严格。默认情况下,只匹配非安全连接(withSecure 默认为 false)且路径完全匹配的Cookie。如果Cookie来自HTTPS(Secure)或路径不精确匹配,会提取失败。
做法:明确指定参数。
scala
getCookieValue(
CookieKey("JSESSIONID")
.withSecure(true) // 明确匹配安全Cookie
.withPath("/app") // 明确匹配路径
.withDomain("example.com")
)
flushSessionCookies:清除会话Cookie
此方法用于立即清空当前会话 CookieJar中所有未设置明确过期时间(即“会话级”或“非持久化”)的 Cookie。这常用于模拟用户注销或清理会话状态。
方法:flushSessionCookies()
重点:只清除会话Cookie,而设置了Max-Age或Expires的持久化Cookie会被保留。flushCookieJar方法会清除所有Cookie。
组合应用示例
下面这个场景综合运用了上述方法,模拟了一个用户登录后因会话Cookie被清除,需要重新登录的流程:
scala
exec(
http("用户登录")
.post("/login")
.formParam("username", "testUser")
.formParam("password", "pass123")
// 登录成功后,服务器的Set-Cookie会被自动存入CookieJar
)
.pause(1)
// 此时,对同域请求的Cookie会自动携带,访问个人页面成功
.exec(http("访问个人主页")
.get("/profile")
)
.pause(1)
// 关键操作:手动清除所有会话Cookie(模拟会话失效)
.exec(flushSessionCookies())
.pause(1)
// 再次尝试访问个人主页,由于Cookie已清除,服务器应返回未授权
.exec(http("Cookie清除后访问主页")
.get("/profile")
.check(status.is(401)) // 验证访问失败
)
// 手动添加一个无效的Cookie,测试服务器的处理
.exec(addCookie(Cookie("session_id", "伪造的无效值")))
.exec(http("使用无效Cookie访问")
.get("/profile")
.check(status.is(403)) // 验证访问仍失败
)
优先依赖自动管理:对于标准会话流程,应信任Gatling的自动Cookie处理。避免不必要的复杂提取和手动设置。
何时手动干预:在需要预置身份、使用Cookie值作为请求参数、测试注销/清理逻辑或处理跨域/特殊路径的Cookie时,再使用上述手动方法。
getCookieValue的注意事项:使用时务必注意Cookie的Secure、Path、Domain属性,并明确指定匹配条件。