JMeter使用BeanShell PostProcessor从Base64解码串提取nameid的方法
问题根因
- 你要处理的是JWT格式令牌,结构为
Base64编码头部.Base64编码载荷.签名三段拼接,直接对完整令牌解码会引入签名段的乱码内容,无法得到有效JSON - 解码后的返回结果是字符串类型,不能直接用
.运算符访问nameid属性,需要先解析为JSON对象才能提取字段 - 原有代码中
log.info("memberid", memberId)的参数格式错误,多参数日志需要用占位符或者字符串拼接
可行实现方案
方案1:修复原有BeanShell代码
首先需要将JSON解析包(org.json.jar)放入JMeter的lib/ext目录,重启JMeter后使用以下代码:
import org.apache.commons.codec.binary.Base64; import org.json.JSONObject; // 拆分JWT,提取中间的载荷段 String payloadPart = data.split("\\.")[1]; // 补全Base64填充符,避免解码异常 while (payloadPart.length() % 4 != 0) { payloadPart += "="; } // 解码载荷段 String decodedPayload = new String(Base64.decodeBase64(payloadPart)); // 解析为JSON对象后提取nameid JSONObject payloadJson = new JSONObject(decodedPayload); String memberId = payloadJson.getString("nameid"); // 输出日志并存储为JMeter变量,后续请求可直接调用 log.info("memberid: {}", memberId); vars.put("member_id", memberId);
后续请求中直接使用${member_id}即可引用该字段值。
方案2:使用JSR223 PostProcessor(官方推荐,性能更高)
JMeter官方更推荐使用Groovy语言的JSR223组件,内置Base64和JSON解析能力,不需要额外导入依赖包:
// 提取JWT载荷段 def payloadPart = data.split("\\.")[1] // 直接Base64解码 def decodedPayload = new String(payloadPart.decodeBase64()) // 解析JSON提取字段 def payload = new groovy.json.JsonSlurper().parseText(decodedPayload) def memberId = payload.nameid // 存储变量 log.info("memberid: ${memberId}") vars.put("member_id", memberId)
内容的提问来源于stack exchange,提问作者Rasik
相关产品推荐
相关产品推荐

