如何使用JMeter按指定间隔重新生成OAuth Access Token并避免重复请求?
解决OAuth Token定时刷新&避免重复认证请求的方案
核心思路
借助JMeter的全局属性、条件判断和临界区控制,确保仅当Token失效或未初始化时触发认证请求,同时避免多线程下重复发送认证请求。
具体操作步骤
初始化Token过期时间戳
测试计划启动时,先通过函数设置全局的Token过期初始时间为0:__setProperty(token_expire_time, 0, )添加Token有效性判断开关
在所有需要使用Token的业务API请求前,插入If Controller,填写判断条件:${__jexl3(${__property(token_expire_time,,0)} < ${__time(,,)},)} || ${__jexl3("${__property(access_token,,)}" == "",)}该条件会在Token未存储,或当前时间已超过过期时间时,触发认证流程。
在判断开关内配置认证逻辑
- 放入获取Access Token的HTTP请求
- 使用
JSON Extractor从返回结果中提取access_token和expires_in(通常为过期秒数,比如3600) - 添加
JSR223 PostProcessor,计算并更新全局Token及过期时间戳:def token = vars.get("access_token") def expiresIn = vars.get("expires_in").toInteger() // 提前1分钟刷新,避免Token刚好过期时请求失败 def expireTime = System.currentTimeMillis() + (expiresIn * 1000) - 60000 props.put("access_token", token) props.put("token_expire_time", expireTime.toString())
多线程下避免重复认证请求
将认证相关的请求和处理器全部放入Critical Section Controller中,确保同一时间只有一个线程执行认证操作,其他线程会等待Token更新完成后再继续。业务API调用Token
在需要携带Token的请求头或参数中,直接通过${__property(access_token,,)}获取全局属性中的Token即可。
注意事项
- 不要在各线程组单独处理Token刷新,统一通过全局属性管理,确保所有线程共享同一有效Token
- 提前刷新的时间可根据实际API校验严格程度调整,比如提前30秒或2分钟
- 若测试时长超过1小时,该逻辑会自动触发Token刷新,无需手动干预
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

