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

这篇具有很好参考价值的文章主要介绍了Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

2.新建http接口

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

2-1 HTTP request

需要填写以下内容。

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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,并设置到下一次请求的请求头中

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

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

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

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

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

3-1 Regular Expression Extractor

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

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

3-2 Boundary Extractor

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

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

要提取的token长这样

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

4-1 JSON Extractor

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

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

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

放在事务控制器里面

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

5-3 添加计数器-Counter

放到循环控制器里面

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

放到循环控制器里面

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

放到接口里面

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

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

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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,如图所示

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

    Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

    Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

    Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

    Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

    Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

    Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

7-5 总结

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

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

其中的每个部件:

(1)全局HTTP Cookie管理器

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

(2)全局HTTP请求头

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

  • 登录前置事务管理器

    Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

  • 边界表达式提取器

    Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

  • 登录事务管理器

    Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

  • 登录请求头

    Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

  • json提取器

    Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

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

  • 业务事务管理器

    Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

  • 业务请求头

    Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试

(6)结果树

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑,Jmeter,jmeter,学习,压力测试文章来源地址https://www.toymoban.com/news/detail-640290.html

到了这里,关于Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JMeter 4.0 如何获取cookie

      如果您觉得有用的话,记得给 博主点个赞,评论,收藏一键三连啊 ,写作不易啊^ _ ^。   而且听说 点赞的人每天的运气都不会太差 ,实在白嫖的话,那欢迎常来啊!!! 1. 修改jmeter.properties 文件 当你要使用cookie中部分参数的时候,就要将CookieManager.save.cookie = true 修改完

    2024年02月09日
    浏览(36)
  • JMeter从入门到精通--开始你的第一个JMeter脚本

    JMeter是一款在国外非常流行和受欢迎的开源性能测试工具,像LoadRunner 一样,它也提供了一个利用本地Proxy Server(代理服务器)来录制生成测试脚本的功能,但是这个功能并不好用。所以在本文中介绍一个更为常用的方法——使用Badboy录制生成 JMeter 脚本。 简单的介绍一下

    2024年02月09日
    浏览(316)
  • 如何使用Jmeter获取及引用token

    (我的公众号“墨石测试攻略”,分享测试技能和实战项目,欢迎关注!) 之前,在文章《接口测试中的Token鉴权-Postman篇》,介绍了使用Postman获取接口返回token的方法。 Jmeter也是一款常用的接口测试工具,如果使用Jmeter,该如何获取Token,并在下一接口引用呢? 这里给大家

    2023年04月08日
    浏览(28)
  • jmeter获取图片验证码-解密图片并识别

    说明:             关于图片验证码的处理方式有三种方法:一是让开发屏蔽验证码,二是让开发后端指定一个万能验证码,三是使用OCR工具进行图片验证码的解密及识别,推荐使用前两种方法最省事;             OCRServer工具识别图片验证码,由于没有对图片进行降噪,

    2023年04月20日
    浏览(92)
  • JMeter关于influxDB 2.x 后端监听器使用

    目前大部分资料都是介绍有关 jmeter 与 influxdb1.x 版本的集成,但是,在 2021 年,influxdb 升级到 2.x 版本,这个版本与 1.x 版本有结构性的调整,完全不兼容,直接要切换过来难度不小,官网和社区这方面的资料也不多,所以我边用边做个笔记,方便自我查阅,有需要的人也可

    2023年04月10日
    浏览(24)
  • jmeter创建一个压测项目

    1.jemeter新建一个项目: 2.接下来对Thread进行描述,也可以先使用默认的Thread进行操作。 3.添加http请求头的信息。按照如图所示操作 4.在请求头里面添加必要的字段,可以只填必要字段就可以 5.添加Http请求信息,如下图,图中需要勾选的要和我这个一样,不然可能有些错误

    2024年02月13日
    浏览(30)
  • JMeter从数据库中获取数据并作为变量使用

    目录 前言: 1、JMeter连接MySQL数据库 2、线程组下新建一个 JDBC Connection Configuration 配置元件 3、实现数据库的查询-单值引用 4、实现数据库的查询-多值引用 前言: 在进行接口测试时,经常需要使用一些动态的数据,例如从数据库中获取用户信息、配置参数等。JMeter提供了多个

    2024年02月12日
    浏览(35)
  • JMeter如何从数据库中获取数据并作为变量使用?

    目录 前言 1、JMeter连接MySQL数据库 2、线程组下新建一个 JDBC Connection Configuration 配置元件 3、实现数据库的查询-单值引用 4、实现数据库的查询-多值引用 总结: JMeter 如何从数据库中获取数据并作为变量使用?这在我们使用 JMeter 做 接口测试 、 压力测试 时经常碰到,今天通

    2024年02月08日
    浏览(65)
  • Jmeter调用Oracle、pg、MySql 储存过程,实例,获取返回值

    JDBC Request: 1、重要参数说明: Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字保持一致 Query:填写的sql语句未尾不要加“;” Parameter valus:参数值 Parameter types:参数类型,可参考:Javadoc for java.sql.Types Variable names:保存sql语句返回结果

    2024年02月08日
    浏览(39)
  • 同一个请求同一个参数,postman发送成功,jmeter失败

    当使用jmeter 请求时吗,注意请求参数中是否包含中文。 问题来由: 1.先用postman发送,成功。  2.一模一样,header一样,请求一样,但是就是一直查询不出来。 3.经过fiddler抓包,再次对比请求头,请求体,还是没有发现有什么差别。 4.猜想: 此接口其他参数传送,都没有问题

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包