JMeter多线程场景下后续线程组重复使用最后一个CSRF Token问题咨询
解决JMeter跨线程组线程私有CSRF Token传递问题
问题根源
你用JMeter属性存储Token,但属性是全局共享的,10个线程生成的Token会依次覆盖,最终所有后续线程组只能拿到最后一个线程生成的Token。而线程变量(用户定义变量)是线程私有的,但默认无法跨线程组直接访问,需要通过以下方法实现线程级别的Token传递。
解决方案
方法1:用线程编号命名全局属性,实现线程专属Token存储
在Login采样器的后置处理器(比如正则表达式提取器/JSON提取器)中,先把Token提取到线程变量csrfToken,再添加BeanShell后置处理器执行以下代码,将每个线程的Token存入带线程编号的全局属性:
String threadId = ctx.getThreadNum().toString(); props.put("csrfToken_" + threadId, vars.get("csrfToken"));
后续线程组的请求头中,通过线程编号匹配对应属性获取Token:
${__P(csrfToken_${__threadNum},)}
方法2:合并线程组,直接使用线程变量传递
如果业务逻辑允许,将Thread Group1、2、3合并到同一个线程组中,这样线程变量csrfToken可直接在后续采样器中使用,每个线程会保留自己生成的Token,无需跨组传递。
方法3:借助Inter-Thread Communication插件实现线程专属队列传递
安装该插件后:
- 在Login采样器后添加
Put Data to Queue元件,设置队列名为csrfTokens,数据填${csrfToken},勾选Put data per thread - 在后续线程组的请求头前,添加
Get Data from Queue元件,队列名设为csrfTokens,将获取到的Token存入线程变量csrfToken,后续请求头直接使用该变量即可。
注意事项
- 确保Thread Group1与后续线程组的线程数一致,保证每个线程能匹配到自己生成的Token
- 若后续线程组需要延迟执行,可添加
Test Action元件设置等待时间,确保Thread Group1的所有线程完成Token生成
内容的提问来源于stack exchange,提问作者Shankar PK
相关产品推荐
相关产品推荐

