如何改用Regular Expression Extractor跨线程组复用Token及正则配置
一、正则表达式提取Token
根据你的响应格式选择对应的正则:
JSON格式场景(比如响应包含
"access_token": "your_token_here"或"token": "xxx"):
正则表达式:"access_token":\s*"([^"]+)"(把access_token换成你实际的键名)
解释:"access_token":匹配Token的键名,\s*忽略键名和值之间的空格,([^"]+)捕获引号内的Token值([^"]表示匹配除引号外的任意字符,+表示至少一个字符)纯文本/Header场景(比如响应是
Token: abc123或Authorization: Bearer xyz789):
正则表达式:Bearer\s+([^\s]+)(针对Bearer Token)或Token:\s*([^\s]+)
正则提取器配置步骤
- 在返回Token的请求下添加「Regular Expression Extractor」
- 填写引用名称:比如
token(后续用${token}调用这个变量) - 正则表达式:填入上面对应场景的表达式
- 模板:
$1$(表示取正则中第一个捕获组的内容,也就是我们要的Token值) - 匹配数字:
1(取第一个匹配到的结果) - 缺省值:可填
TOKEN_NOT_FOUND,方便后续排查问题
二、跨线程组复用Token
JMeter的普通变量仅在当前线程组有效,跨线程组需要用到全局属性,步骤如下:
1. 存储Token到全局属性
在提取Token的线程组里,给返回Token的请求添加「BeanShell PostProcessor」(注意要放在正则提取器之后),写入代码:
// 从正则提取器的变量中获取Token,存入全局属性 props.put("global_token", vars.get("token"));
vars.get("token"):获取正则提取器中引用名称为token的变量值props.put("global_token", ...):将Token存入名为global_token的全局属性
2. 在其他线程组中调用Token
有两种常用方式:
方式一:HTTP Header Manager直接调用
在目标线程组的HTTP请求下添加「HTTP Header Manager」,新增Authorization头,值填:Bearer ${__P(global_token,)}解释:
${__P(global_token,)}是JMeter函数,用于获取全局属性global_token的值,逗号后是缺省值(可留空)方式二:BeanShell PreProcessor添加Header
在目标线程组的HTTP请求下添加「BeanShell PreProcessor」,写入代码:String token = props.get("global_token"); sampler.addHeader("Authorization", "Bearer " + token);
注意事项
- 确保提取Token的线程组在目标线程组之前执行(JMeter默认按线程组顺序执行,若需并行需额外配置)
- 用「View Results Tree」的「RegExp Tester」功能验证正则表达式是否能正确匹配Token
- 检查BeanShell组件的顺序:正则提取器要在BeanShell PostProcessor之前,确保先提取再存储
内容的提问来源于stack exchange,提问作者Golam Mawla

