You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter负载测试中每10分钟自动更新授权令牌问题排查

JMeter实现每10分钟自动刷新授权令牌方案

现有代码的问题

你当前的逻辑存在几个关键错误:

  1. 时间变量使用不当:在JSR223脚本中直接嵌入${__time(,)}会导致语法解析问题,Groovy脚本应优先使用原生API获取时间。
  2. 时间差阈值错误:你设置的判断条件是diff>=100(100毫秒),但实际需要的是10分钟(600000毫秒),数值完全不符。
  3. 未处理初始值为空的情况:如果startTime变量未提前初始化,第一次执行时vars.get("startTime")会返回null,直接调用toLong()会抛出空指针异常。
  4. 冗余的flag变量:没必要通过中间变量flag传递判断条件,直接在If Controller中计算时间差更高效。

修正后的实现步骤

1. 初始化起始时间

在测试计划的用户定义变量中添加startTime,值设为${__time(,)},确保脚本启动时就有初始时间戳。

2. 修改JSR223 Post Processor脚本

替换原有代码为以下内容(放在需要触发令牌刷新的请求之后,比如主API请求的Post Processor):

// 获取起始时间,处理空值情况
def startTime = vars.get("startTime") ?: System.currentTimeMillis().toString()
long currentTime = System.currentTimeMillis()
long diff = currentTime - startTime.toLong()

// 10分钟 = 600000毫秒
if (diff >= 600000) {
    // 更新起始时间为当前时间
    vars.put("startTime", currentTime.toString())
    // 设置刷新标记
    vars.put("needRefreshToken", "true")
} else {
    vars.put("needRefreshToken", "false")
}

log.info("距上次令牌刷新已过 ${diff/1000} 秒,是否需要刷新:${vars.get("needRefreshToken")}")

3. 配置If Controller

将授权请求放在If Controller下,设置条件为:

${__groovy(vars.get("needRefreshToken") == "true" || vars.get("auth_token") == null,)}

这个条件会在两种情况触发授权请求:一是首次运行还没有令牌,二是时间差达到10分钟需要刷新。

4. 提取并传递新令牌

在授权请求的正则表达式提取器或JSON提取器中,将返回的令牌提取到auth_token变量(比如从响应JSON的access_token字段提取)。然后在所有需要授权的API请求的Authorization Header中使用Bearer ${auth_token}(根据你的认证类型调整)。

5. 注意事项

  • 确保JSR223脚本的语言选择为Groovy,并勾选"Cache compiled script if available"提升性能。
  • 如果是多线程负载测试,每个线程会维护自己的startTime和auth_token变量,确保每个线程独立刷新令牌。

内容的提问来源于stack exchange,提问作者HopefullyHelpful

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:05:33