在JMeter中处理动态Token和验证码是解决参数关联问题-从前一个请求的响应里提取变化的值,传给后续请求。正则表达式提取器是最常用的关联工具,不同场景可以有几种思路。
思路一:从响应中直接正则提取动态Token
适用于 CSRF Token、ViewState、JWT、Session ID 等放在响应体或响应头里的动态值。
操作步骤
在需要提取数据的 HTTP 请求上,右键添加 -后置处理器 - 正则表达式提取器。
配置字段:
引用名称:如 token
正则表达式:根据实际响应内容写,比如提取隐藏域值:
<input type="hidden" name="__RequestVerificationToken" value="(.*?)" />
模板:$1$(表示取第一个括号一致的内容)
一致 No.:1
缺省值:NOT_FOUND
后续请求中直接使用 ${token} 引用该值。
如果Token在响应头里(如 Set-Cookie),在提取器中把“要检查的响应字段”选为 响应头 即可。
对于JSON响应,虽可用JSON提取器,但正则也能应对,如 "access_token":"(.*?)"。
思路二:正则提取文本型验证码或隐藏答案
有些测试环境或低安全系统会把验证码答案直接写在响应里,此时正则依然适用。
常见形式:
页面隐藏域:<input type="hidden" id="captchaAns" value="A3B7" />
注释里的答案:<!-- captcha:8888 -->
Cookie 里直接存放明文验证码
正则示例:
<input type="hidden" id="captchaAns" value="(.*?)" />
提取后,登录请求的参数直接传入 ${captchaAns} 即可。
思路三:正则提取算式验证码,并计算答案
如果验证码是简单的算术题(如“3 + 8 = ?”),可先用正则提取算式,再通过函数或脚本计算。
示例: 响应中包含 <span id="mathCaptcha">3+8=?</span>
正则提取算式:<span id="mathCaptcha">(\d+)\+(\d+)=</span>
模板可使用 $1$ 和 $2$ 分别获取两个数字,比如引用名 num1、num2。
计算答案,可以用 JMeter 内置函数 __intSum:
${__intSum(${num1},${num2},answer)} → 得到变量 ${answer},值为 11。
也可用 JSR223 脚本更灵活地处理加减乘除。
将 ${answer} 填入验证码参数提交。
思路四:图形验证码的间接正则提取(提取图片 - OCR 识别 - 再正则提取结果)
对于真正的图形验证码,答案无法直接正则提取,但可以围绕识别流程两次使用正则:
正则提取图片 URL 及必要 Cookie/Token
如:<img id="captchaImg" src="(/getCaptcha\?t=\d+)" />
提取出相对途径,拼接后发送 HTTP 请求获取图片。
将图片传给 OCR 服务(本地 Tesseract 或打码平台),再用正则从OCR响应中提取文本答案
如果使用打码平台(如超级鹰),会返回类似 {"code":"1234"} 的响应,
用正则 "code":"(.*?)" 提取出验证码文本。
把提取到的文本作为验证码参数提交。
这样,整个链条的关联动作仍然由正则提取器完成。
思路五:绕过/固定验证码 + 专注处理动态 Token
在性能测试环境中,最推荐的做法是和开发协商屏蔽或固定验证码:
屏蔽:测试环境关闭验证码检查。
固定万能码:统一使用 888888 或从 Redis/数据库预置答案(该答案可直接参数化,无需提取)。
此时脚本只需集中精力用思路一处理好动态 Token,大大降低脚本复杂度,也让测试更稳定。
建议
调试技巧:在脚本中添加调试取样器(Debug Sampler)或通过察看结果树结合RegExp Tester来验证正则是不是正确。
正则转义:JMeter 的正则表达式和 Perl 风格相同,特殊字符 ? . * + [ ] ( ) { } ^ $ | \ 需根据需要加 \ 转义。
提取器选择:如果是 JSON 响应,优先用 JSON 提取器;边界清晰的值可用边界提取器;但正则提取最通用,适合以上所有灵活场景。
结合这几种思路可以根据被测应用的实际验证码/Token 实现方式,灵活组合正则提取器实现自动化参数关联。