Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑

news2024/12/24 0:23:16

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑

现在想对一个接口做性能测试,需要测试它多个线程并发下的调用

1.新建测试计划和线程组

2.新建http接口

一个完整的http接口包含请求头和请求,这里就需要两个组件:HTTP request、HTTP Header Manager。

2-1 HTTP request

需要填写以下内容。

image-20230119162208426

2-2 HTTP Header Manager

这里需要关注的是X-XSRF-TOKEN,它是动态的。

如果是第一次发请求,请求参数不带X-XSRF-TOKEN,响应头就会返回一个X-XSRF-TOKEN。

第二次请求就必须在请求头中带上上次请求返回的X-XSRF-TOKEN,否则就会返回403,并报错如下。

Invalid CSRF Token 'null' was found on the request parameter 'csrf' or header 'x-xsrf-token'

那么这里的难点就在于每次都需要从上一次请求的响应头中获取返回的X-XSRF-TOKEN,并设置到下一次请求的请求头中

image-20230119162321370

响应头中要提取的数据长这样:

image-20230129103948223

3.提取response Header返回的动态变量

这里介绍了正则表达式提取和边界表达式提取两种方法,任选一种即可。

遇到的一个坑,暂时不知道为什么:

在本地启动项目时,即项目地址的IP是localhost时,正则提取不到,必须用边界表达式提取;

在云服务器上启动时,即项目地址的IP是云服务器的IP时,边界表达式提取不到,必须用正则提取。

3-1 Regular Expression Extractor

通过正则表达式提取和引用X-XSRF-TOKEN

image-20230129103843442

提取之后在下一个请求的请求头中这样引用

image-20230129104054024

3-2 Boundary Extractor

通过边界表达式提取和引用X-XSRF-TOKEN

image-20230129104358077

提取之后在下一个请求的请求头中这样引用

image-20230129104430298

4.提取登录后response Data返回的token

要提取的token长这样

image-20230129112602450

4-1 JSON Extractor

image-20230129112426309

5.设置一个接口的多次调用

5-1 添加事务控制器-Transaction Controller

image-20230129113531808

5-2 添加循环控制器-Loop Controller

放在事务控制器里面

image-20230129113511558

5-3 添加计数器-Counter

放到循环控制器里面

image-20230129113818171

5-4 添加BeanShell取样器-BeanShell Sampler

放到循环控制器里面

image-20230129113940393

5-5 添加http接口

放到循环控制器里面

接口里面包含HTTP request和HTTP Header Manager,除此之外,要想对接口进行参数化,即多次调用接口每次传入不同的参数,还需要添加CSV数据文件配置

5-5-1 HTTP request

5-5-2 HTTP Header Manager

5-5-3 CSV Data Set Config

放到接口里面

image-20230129172400604

6.添加结果树查看运行结果

放在线程组下面,就显示线程组的运行结果。

image-20230129175050460

7.一个关于jmeter获取X-XSRF-TOKEN时的坑

​ 一次业务需求中需要对某些业务接口进行接口性能测试。都是调试通过的接口,在jmeter中录入后调用却卡在鉴权的第一步,反复报403失败。

​ 这里必须讲一下我们业务设计里调用接口的前提:X-XSRF-TOKEN和access_token双认证。

X-XSRF-TOKEN:在每一次请求时生成一个XSRF-TOKEN,必须在之后的每个请求中传递

access_token:在登陆成功后返回一个access_token,每一次业务接口调用都需要这个access_token

报错内容:

403 {"error":"access_denied","error_description":"Could not verify the provided CSRF token because your session was not found."}

也就是我还卡在第一步,登录接口都没调通,原因是没有携带X-XSRF-TOKEN发送请求。

尝试了n次之后,大概把失败的情况分为两种:

1.未添加HTTP Cookie Manager

2.添加了HTTP Cookie Manager

7-1 未添加HTTP Cookie Manager

(1)第一个请求:请求失败报403。没有携带X-XSRF-TOKEN时发送请求,响应中会自动返回一个X-XSRF-TOKEN,图略,下面有

(2)第二个请求:请求失败报403。请求头中携带从第一个请求响应头中提取到的X-XSRF-TOKEN

(3)第三个请求:请求失败报403。请求头中携带从第二个请求响应头中提取到的X-XSRF-TOKEN

所以得出结论:这里必须添加HTTP Cookie Manager。

如果不添加HTTP Cookie Manager,请求一个也成功不了,虽然我每次请求都带上了上一次请求返回的X-XSRF-TOKEN,请求仍然会失败报错。

7-2 添加了HTTP Cookie Manager

(1)第一个请求:请求失败报403。没有携带X-XSRF-TOKEN时发送请求,响应中会自动返回一个X-XSRF-TOKEN,如图所示

image-20230130155455370

image-20230130154718437

(2)第二个请求:请求成功报200。请求头中携带从第一个请求响应头中提取到的X-XSRF-TOKEN,但响应Header中本来应该有的【Set-Cookie: XSRF-TOKEN=…】却消失了

image-20230130155204313

(3)第三个请求:请求失败报403。由于第二个请求返回的响应Header中没有XSRF-TOKEN,所以没有携带X-XSRF-TOKEN时发送请求,错误同第一个请求

image-20230130155610737

image-20230130155558297

7-3 原因分析

这个问题困扰了我非常非常久,并且也没有在网上搜索到同类问题,使用apifox、postman等工具都不会出现这种情况,只有jmeter反复失败:

  • 尝试不添加HTTP Cookie Manager,一次请求也成功不了;

  • 一旦添加HTTP Cookie Manager,第二次请求能够成功,但从第二次请求起,返回的响应头中的【Set-Cookie:XSRF-TOKEN=…】就没有了,导致后面请求全部失败,非常见鬼。

后来慢慢意识到原因可能是:【Set-Cookie:XSRF-TOKEN=…】第二次被返回过来时,它已经被交给HTTP Cookie Manager来管理了,就不在响应头中展示了。

延申发现,不仅仅是【XSRF-TOKEN】,所有响应头中的【Set-Cookie:xxx=】都只会在响应头中出现一次,第二次请求中返回【xxx】变量,jmeter就会将其交给HTTP Cookie Manager来管理,它也就不再显示在response header中了。

注:Set-Cookie开头的响应头内容,意味着把Set-Cookie中的键和值设置到cookie中

为了验证这个猜测,连续三次调用登录接口发现:

  • 第一次调用:因为未携带X-XSRF-TOKEN,登录失败,返回的响应头中【Set-Cookie:XSRF-TOKEN=…】
  • 第二次调用:携带X-XSRF-TOKEN,登录成功,返回的响应头中【Set-Cookie:XSRF-TOKEN=…】消失了,但多出【Set-Cookie:access_token=…】、【Set-Cookie:session_token=…】
  • 第三次调用:登录失败,返回的响应头中没有任何【Set-Cookie:…】数据

出现过一次的【Set-Cookie:xxx=…】没有再出现第二次。

这个尝试不能完全证明我的猜测,但也没有证伪。

然后我开始进一步验证我所需要的结论:接口每次调用其实都返回了对应的【Set-Cookie:XSRF-TOKEN=…】,只是由于被jmeter的HTTP Cookie Manager管理了,所以第二次返回的XSRF-TOKEN不再存在于响应头中,而是存在于cookie中。

7-4 解决方案

那么只有第一次请求后需要用正则表达式获取响应头中的XSRF-TOKEN,第二次及之后就需要从cookie中去取它的值

注:jmeter中从cookie中获取变量值语法:${COOKIE_变量名}

  • 第一次请求:因为未携带X-XSRF-TOKEN,登录失败,返回的响应头中【Set-Cookie:XSRF-TOKEN=…】,图略

  • 第二次请求:从边界表达式提取第一次请求返回的响应头中的XSRF-TOKEN

    image-20230130164248310

    image-20230130164110297

  • 第三次请求:从cookie中提取第二次请求返回的响应头中的XSRF-TOKEN(被设置到cookie中,响应头中提取不到了)

    image-20230130164629716

    image-20230130165006512

  • 第四次请求:从cookie中提取第三次请求返回的响应头中的XSRF-TOKEN(被设置到cookie中,响应头中提取不到了)

    image-20230130164711342

    image-20230130164851312

7-5 总结

所以整理之后的脚本进行合理的调整后应该长这样:

image-20230130173133227

其中的每个部件:

(1)全局HTTP Cookie管理器

image-20230130173437207

(2)全局HTTP请求头

image-20230130173714739

(3)登录前置事务管理器、边界表达式提取器

  • 登录前置事务管理器

    image-20230130173749251

  • 边界表达式提取器

    image-20230130173804687

(4)登录事务管理器、登录请求头、json提取器

  • 登录事务管理器

    image-20230130173832029

  • 登录请求头

    image-20230130173846686

  • json提取器

    image-20230130173904756

(5)业务事务管理器、业务请求头

  • 业务事务管理器

    image-20230130173924742

  • 业务请求头

    image-20230130173941402

(6)结果树

image-20230130173950898

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/842870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言函数作为形参的注意事项

1、c语言数组作为形参会退化成数组指针 #include "stdio.h" #include <stdlib.h>//数组作为函数的形参会退化成指针 void print_arr(int a[5]);// int *b int main() {int arr[5] { 1,2,3,4,5 };print_arr(arr);return 0; }void print_arr(int a[5]) {printf…

SocialFi 的开发中如何利用 NFTScan API 获取 NFT 数据

SocialFi 作为社交媒体与 Web3 的创新融合&#xff0c;致力于构建更加开放去中心化的社交平台。它赋能用户拥有数据控制权、实现内容价值&#xff0c;并通过代币经济建立起激励与治理机制&#xff0c;这正是 Web3 社交的独特魅力所在。SocialFi 为我们描绘了一个更加用户驱动、…

从0开始全栈深度学习工程师之路(四):VSCode提效设置和插件

在从0开始深度学习工程师之路&#xff08;三&#xff09;&#xff1a;Python开发环境搭建&#xff08;VSCode) 中,我们一步步搭建了基于VSCode的开发环境&#xff0c;这一篇我们继续优化我们的开发环境&#xff0c;毕竟工欲善其事&#xff0c;必先利其器。 配置 同步设置 我…

GG修改器安装与Root环境的安装

关于GG修改器大家应该都有一定的了解吧&#xff0c;就是类似于电脑端CE的一个软件。 GG修改器在百度云盘里请自行下载&#xff01; 百度网盘链接&#xff1a;https://pan.baidu.com/s/1p3KJRg9oq4s0XzRuEIBH4Q 提取码&#xff1a;vuwj 那我要开始了&#xff01; 本来不想讲GG…

WMS仓储管理系统的价值从哪些方面体现

仓库管理在不断改善&#xff0c;采用信息化来管理仓库。自从使用了WMS仓储管理系统解决方案后&#xff0c;仓库管理的效率大大提高了&#xff0c;而且WMS系统有很多价值。 首先&#xff0c;WMS系统可以帮助员工更省时省力地完成仓库管理工作&#xff0c;提高效率和准确性。传统…

农业大数据可视化平台,让农业数据更直观展现!

农业大数据可视化平台是指利用大数据技术和可视化工具&#xff0c;对农业领域的数据进行收集、整理、分析和展示的平台。它可以帮助农业从业者更好地理解和利用农业数据&#xff0c;提高农业生产效率和决策水平。 农业大数据可视化平台通常具有以下特点和功能&#xff1a; 数据…

WorkTool企微机器人自动接收图片回传(方案三)

自动接收图片并上传到服务器&#xff0c;仅适用企业微信应用 前言 WorkTool企微机器人可以接收客户群的消息&#xff0c;但接收图片一直是个问题&#xff0c;前面也介绍过两种图片接收方案&#xff0c;但都会影响运行效率&#xff0c;并且不能达到100%的图片接收率&#xff0…

配置两台数据库为主从数据库模式

一、主库配置 1、修改配置文件 /etc/my3306.cnf #mysql服务ID&#xff0c;保证整个集群环境中唯一&#xff0c;默认为1server-id1#是否只读&#xff0c;1代表只读&#xff0c;0代表读写read-only0#忽略的数据&#xff0c;指不需要同步的数据库#binlog-ignore-dbmysql#指定同步…

Jmeter命令行运行实例讲解

1. 简介 使用非 GUI 模式&#xff0c;即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资 本文介绍windows下以命令行模式运行的方法。 1.1. 命令介绍 jmeter -n -t <testplan filename> -l <listener filename> 示例&#xff1a; jmeter -n -t test…

承泰科技Q3再获30多个智驾项目,新增订单0.86亿!累计近11亿!

中国毫米波雷达市场正处于高速发展期&#xff0c;以承泰科技为代表的本土供应商在前装量产赛道上展示出加速度。 高工智能汽车研究院预测&#xff0c;随着L2及L2持续处于市场增长的高速期&#xff0c;对应毫米波雷达上车量将在2023年实现30-50%的同比增速。 根据高工智能汽车…

Gpt微信小程序搭建的前后端流程 - 前端小程序部分-1.基础页面框架的静态设计(二)

Gpt微信小程序搭建的前后端流程 - 前端小程序部分-1.基础页面框架的静态设计(二) 在开始这个专栏&#xff0c;我们需要找一个小程序为参考&#xff0c;参考和仿照其界面&#xff0c;聊天交互模式。 这里参考小程序-小柠AI智能聊天&#xff0c;可自行先体验。 该小程序主要提供了…

轻量级容器管理工具 Containerd

1. 轻量级容器管理工具 Containerd 2. Containerd的两种安装方式 3. Containerd容器镜像管理 4. Containerd数据持久化和网络管理 1. 前言 早在2016年3月&#xff0c;Docker 1.11的Docker Engine里就包含了containerd&#xff0c;而现在则是把containerd从Docker Engine里彻底…

空地协同智能消防系统——无人机、小车协同

1 题目 1.1 任务 设计一个由四旋翼无人机及消防车构成的空地协同智能消防系统。无人机上安装垂直向下的激光笔&#xff0c;用于指示巡逻航迹。巡防区域为40dm48dm。无人机巡逻时可覆盖地面8dm宽度区域。以缩短完成全覆盖巡逻时间为原则&#xff0c;无人机按照规划航线巡逻。发…

8-7 homework

1.思维导图 2.写一个函数&#xff0c;获取用户的uid和gid并使用变量接收

快速降低javacv依赖包的大小

前言&#xff1a; 由于在项目中需要对视频进行缩略图的截图处理&#xff0c;引入了javacv-platform的包&#xff0c;但是打包后发现打出来的jar包非常的大 后面得知是因为javacv-platform会将所有平台的包集中起来处理&#xff0c;导致包特别的大 处理&#xff1a; 我们在项目…

Linux网络配置与测试

不得不会的网络 一、查看网络配置1.1 显示网络接口的信息 ifconfig命令1.1.1 查看所有已启用的网络接口信息1.1.2 查看所有接口&#xff08;包括未启用&#xff09;1.1.3 查看指定网络接口 1.2 显示当前主机名------hostname命令1.3 查看主机中的路由表信息------route命令1.4 …

【并发编程】ShenyuAdmin里面数据同步用到的无锁环形队列LMAX Disruptor并发框架

并发&#xff0c;数据同步往往是业务开发中比较重要的部分。 shenyu网关数据同步设计方案图 shenyu官网给出的同步设计方案图如下&#xff1a; 基于事件异步并发框架com.lmax.disruptor 下载下示例代码&#xff0c;跑起来发现&#xff0c;在shenyuAdmin模块里面用到了com.lma…

UNITY3D 虚拟数字人方向,动捕设备测评 VDSuit-Full

我们成功的用它做了线下演出活动。 开发测试视频 VDSuit-Full动捕开发 分别说优点和不足 优点&#xff1a; 人工技术答疑及时 有厂家解答各种疑难杂症&#xff08;工作日一般1小时就得到回复&#xff09; 比如穿戴&#xff0c;使用方法&#xff0c;限制等。 动作整体捕捉效果较…

tomcat上部署jpress

一.确保有jdk&#xff0c;tomcat和mysql环境 二.新建jpress数据库&#xff0c;新建jpress用户并赋予所有权限 三.将jpress的war上传到tomcat/apache-tomcat-8.5.70/webapps&#xff0c;具体根据你的实际tomcat安装路径为准&#xff0c;上传完成后他会自己解包 四.到浏览器完…

FFmpeg 编码详细流程

介绍 FFmpeg的 libavcodec 模块完成音视频多媒体的编解码模块。FFmpeg 本身不具有音视频编码的功能和底层能力&#xff0c;只是对各类第三方的编码器API 进行封装调用。老版本的 FFmpeg 将avcodec_encode_video2()作为视频的解码函数 API&#xff0c;将avcodec_encode_audio2(…