问题描述
我正在尝试在 JMeter 中记录一个场景,它可以让我登录应用程序并执行一些操作,但是当我尝试重现记录的场景时,我卡在了登录阶段。我在浏览器中设置了代理,设置了根 JMeter 证书,JMeter 记录了所有内容。
在登录时,我正在执行这样的 POST 请求:
POST https://ip:port/api/logon
POST 数据:
{"user":"text","member":"text","password":"text"}
Cookie 数据:
JSESSIONID=node{random}.node{random}
但它失败了 response code 400 (Bad request)
。
我认为我应该捕获 X-XSRF-TOKEN 并使用它来以正确的方式访问会话,但我不能这样做。在此请求之前,我正在尝试使用 JMeter 的正则表达式提取器将 X-XSRF-TOKEN 捕获到 ${token} 变量中。我可以在“响应头”中看到它,但仍然找不到捕获它以能够登录此资源的方法。
如何使用保存X-XSRF-TOKEN的JMeter测试脚本记录器登录HTTPS资源?
更新: 我想出了如何使用正则表达式从响应头中获取 XSRF-TOKEN。格式如下:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie 我还使用了这篇文章中的信息:https://www.blazemeter.com/blog/how-load-test-csrf-protected-web-sites
为了得到它,我使用了 JMeter 的正则表达式提取器,其中:
Field to check: Response-Headers
Regular expression: Set-Cookie: XSRF-TOKEN=([^;]+?)
我发现 JMeter 的正则表达式解析器可能贪婪和反向。
Template: $1$
Match No.: 1
Default Value: NOT_FOUND
之后,我将 ${XSRF_TOKEN} 提供给下一个 HTTP 请求的 HTTP 标头管理器中的 X-XSRF-TOKEN 字段,但是当我启动脚本时,它仍然无法工作并向我发送一个新的 X -XSRF-TOKEN 在响应头中。
更新№2:
我发现 jmeter 没有发送在 Chrome 浏览器中打开开发者控制台所需的所有 cookie -> 网络 [记录]。 它发送 JSESSIONID cookie,但不发送 XSRF_TOKEN cookie。现在我正在努力将此 cookie 添加到我的请求中,以便它能够建立会话。 似乎只是将它添加到 HTTP Cookie 管理器中,例如:
Name: XSRF-TOKEN
Value: ${XSRF_TOKEN}
Domain: XXX
Path: /
Secure: yes\no
不会工作,因为变量值没有分配,它只是在 cookie 发送请求中显示 ${XSRF_TOKEN}。
解决方法
我终于找到了我的问题的答案。
它非常相似
How to write regular expression in JMeter for CSRF token?
但我用过
Regular-expression: XSRF-TOKEN=([^;]+?)
然后我在 HTTP Header 中设置 cookie,例如:
似乎只是将它添加到 HTTP Cookie 管理器中,例如:
Name: XSRF-TOKEN
Value: ${XSRF_TOKEN}
Domain: XXX
Path: /
Secure: yes\no