JMeter负载测试:如何实现HTTP登录仅执行一次,其余请求循环?
JMeter实现全局单次登录获取JWT方案
方法1:Setup Thread Group全局单次登录(推荐)
这个方案能确保登录请求在所有业务线程启动前仅执行一次,适配几百线程的高并发场景:
- 添加Setup Thread Group,设置线程数=1、循环次数=1,内部放置登录请求。
- 在登录请求后添加JSON Extractor,提取AuthorizationToken,变量名设为
auth_token。 - 紧接着添加JSR223 PostProcessor,将提取的token存入全局属性:
props.put("GLOBAL_AUTH_TOKEN", vars.get("auth_token")) - 回到你的主业务线程组(含Transaction Controller和Throughput Controller的那个),在所有业务请求前添加JSR223 PreProcessor,取出全局token并设置为线程变量:
vars.put("auth_token", props.get("GLOBAL_AUTH_TOKEN")) - 所有需要JWT的请求,在HTTP Header Manager中引用
${auth_token}即可。
方法2:整合到现有线程组实现单次登录
如果必须将登录逻辑放在现有业务线程组内,可通过线程编号判断+全局变量共享实现:
- 在现有线程组最前端添加Once Only Controller,内部放置登录请求和JSON Extractor(提取
auth_token)。 - 在Once Only Controller内添加JSR223 PostProcessor,仅让第一个线程存储全局token:
if (ctx.getThreadNum() == 0) { props.put("GLOBAL_AUTH_TOKEN", vars.get("auth_token")) } - 在业务请求前添加JSR223 PreProcessor,让其他线程等待全局token生成后再执行:
while (!props.containsKey("GLOBAL_AUTH_TOKEN")) { sleep(100) } vars.put("auth_token", props.get("GLOBAL_AUTH_TOKEN")) - 业务请求中正常引用
${auth_token}。
核心注意事项
vars是线程局部变量,仅当前线程可见;props是JMeter全局属性,所有线程共享,必须用props存储全局JWT。- 几百线程场景下优先选方法1,避免线程等待可能引发的启动延迟问题。
- 确保登录请求的循环次数设为1,不受其他控制器的循环/比例配置影响。
内容的提问来源于stack exchange,提问作者EBDS
相关产品推荐
相关产品推荐

