当前位置: 首页 > news >正文

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

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

相关文章:

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

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑 现在想对一个接口做性能测试,需要测试它多个线程并发下的调用 1.新建测试计划和线程组 略 2.新建http接口 一个完整的http接口包含请求头和请求,这里就需要两个组件:HTTP request、HT…...

SQL注入总结

0x00 前言 简单的总结一下SQL注入的内容 0x01 常规注入 通过特殊字符测试闭合,通常使用的闭合方式有 " ) ")等 1.判断字段 a union select 1,2,3 #2.执行基础内容 a union select 1,database(),3 #3.查表 a union select 1,group_concat(table_na…...

Java 实现 后端分页

背景说明 在实际开发中,基于数据库表结构进行SQL查询,如果要对结果进行分页,可以借助一些工具类,如:基于Mybatis的 工具类 PageHelper。 但是,有时分页的对象是经过一些业务逻辑处理的列表,如…...

数据结构 | 搜索和排序——排序

目录 一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、归并排序 六、快速排序 排序是指将集合中的元素按照某种顺序排序的过程。 一、冒泡排序 冒泡排序多次遍历列表。它比较相邻的元素,将不合顺序的交换。每一轮遍历都将下一个最大值放到正确的位…...

【嵌入式环境下linux内核及驱动学习笔记-(18)LCD驱动框架1-LCD控制原理】

目录 1、LCD显示系统介绍1.1 LCD显示基本原理1.1.1 颜色的显示原理:1.1.2 图像的构成 1.2 LCD接口介绍1.2.1 驱动接口 - MCU接口1.2.2 驱动接口 - RGB接口1.2.3 驱动接口 - LVDS接口1.2.4 驱动接口 - MIPI接口1.2.5 RGB / MIPI / LVDS三种接口方式的区别&#xff1a…...

【unity】ShaderGraph实现等高线和高程渐变设色

【unity】ShaderGraph实现等高线和高程渐变设色 等高线的实现思路 方法一: 通过Position节点得到顶点的高度(y)值,将高度值除去等高距离取余,设定余数的输出边界(step) 方法二: 将…...

快速修复应用程序中的问题的利器—— Android热修复

热修复技术在Android开发中扮演着重要的角色,它可以帮助开发者在不需要重新发布应用程序的情况下修复已经上线的应用程序中的bug或者添加新的功能。 一、热修复是什么? 热修复(HotFix)是一种在运行时修复应用程序中的问题的技术…...

什么是全局代理,手机怎么设置全局代理

目录 什么是全局代理 全局代理的优缺点 优点 缺点 手机怎么设置全局代理 注意事项 总结 在计算机网络和信息安全中,全局代理是一种常用的技术手段,用于将网络流量通过代理服务器进行转发和处理。本文将介绍什么是全局代理,探讨全局代理…...

技术领先产品ASSAR300一一基于SAR成像的角雷达产品,助力自动泊车

作为自动驾驶应用场景中最先被推广和商业化落地的自动泊车功能,目前是在一些限定环境下实现了功能跑通。面对多种多样的复杂停车场场景,系统需要不断增强感知算法能力或寻求新的传感器技术,来提升对周围环境感知和对障碍物探测的精准度。 传…...

单元测试之 - Spring框架提供的单元/集成测试注解

Spring框架提供了很多注解来辅助完成单元测试和集成测试(备注:这里的集成测试指容器内部的集成测试,非系统间的集成测试),先看看Spring框架提供了哪些注解以及对应的作用。RunWith(SpringRunner.class) / ExtendWith(SpringExtension.class)&…...

深入学习 Redis - 事务、实现原理、指令使用及场景

目录 一、Redis 事务 vs MySQL事务 二、Redis 事务的执行原理 2.1、执行原理 2.2、Redis 事务设计这么简单,为什么不涉及成 MySQL 那样强大呢? 三、Redis 事务的使用 3.1、使用场景 3.2、具体演示 开启/执行/放弃事务 watch 监控 watch 实现原理…...

异步javaScript

在本文中,我们将解释什么是异步编程,为什么我们需要它,并简要讨论 JavaScript 历史上异步函数是怎样被实现的。 预备知识:基本的计算机素养,以及对 JavaScript 基础知识的一定了解,包括函数和事件处理程序…...

看跨境电商世界区域分布,Live Market教你深入参与跨境创业

随着全球化发展带来互联网技术的进步和平台经济的触角伸向全球,跨境电商越来越成为全球贸易的重要组成部分。根据国际数据公司(IDC)的最新数据显示,全球前五大跨境电商平台分别是亚马逊、阿里巴巴、eBay、Wish和京东全球购。这五家…...

python中的装饰器的真正含义和用法

闭包: 闭包是python中的一个很实用的写法,可以使得用户在函数中调用该函数外的函数的变量,使得该变量常驻于内存中。 闭包函数: 输入是函数,输出也是一个函数。 装饰器的写法是python闭包的语法糖。 面试中经常面…...

opencv基础-38 形态学操作-闭运算(先膨胀,后腐蚀)cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。 例如,在图 8-17 中,通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔(内部闭合的…...

RocketMQ生产者和消费者都开启Message Trace后,Consume Message Trace没有消费轨迹

一、依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.0.3</version> </dependency>二、场景 1、生产者和消费者所属同一个程序 2、生产者开启消…...

JDV背后的技术-助力618 | 京东云技术团队

一、项目介绍 JDV&#xff08;可视化大屏&#xff09;是京东内部搭建可视化大屏的数据工具平台&#xff0c;内置10种模版特效&#xff0c;40种风格各异的图表、导航等组件。与集团其他数据工具打通&#xff0c;支持一站式、自助化、拖拽式搭建大屏&#xff0c;实现数据切换、联…...

0基础学习VR全景平台篇 第78篇:全景相机-拍摄VR全景

新手入门圆周率科技&#xff0c;成立于2012年&#xff0c;是中国最早投身嵌入式全景算法研发的团队之一&#xff0c;亦是全球市场占有率最大的全景算法供应商。相继推出一体化智能屏、支持一键高清全景直播的智慧全景相机--Pilot Era和Pilot One&#xff0c;为用户带来实时畅享…...

Spring MVC简介与概述

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

java基础复习(第六日)

java基础复习(五) 1.是否了解类似 RabbitMQ.kalka 之类的队列服务? 请简述队列取务中的常见要素和使用场景&#xff1f; 了解&#xff0c;队列服务是一种应用间的通信方式&#xff0c;可以实现异步处理、应用解耦、流量削峰和消息通信等功能 队列服务的常见要素&#xff1a…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

DeepSeek越强,Kimi越慌?

被DeepSeek吊打的Kimi&#xff0c;还有多少人在用&#xff1f; 去年&#xff0c;月之暗面创始人杨植麟别提有多风光了。90后清华学霸&#xff0c;国产大模型六小虎之一&#xff0c;手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水&#xff0c;单月光是投流就花费2个亿。 疯…...

数据挖掘是什么?数据挖掘技术有哪些?

目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...