如何在JMeter中提取请求头的x-csrf-token并传递至POST HTTPS请求?
解决X-CSRF-Token提取失败及过期问题的方案
一、正确提取X-CSRF-Token的三种方式
- 从响应头提取:多数服务会在首次初始化请求(如GET页面、基础接口)的响应头中返回
X-CSRF-Token字段,直接取值即可。示例(Python requests):
import requests session = requests.Session() # 先发起初始化请求获取token init_res = session.get("https://目标域名/初始化路径") csrf_token = init_res.headers.get("X-CSRF-Token")
- 从页面meta标签提取:若token嵌入在页面HTML中,查找
<meta name="csrf-token" content="xxx">这类标签,用解析工具提取。示例(Python BeautifulSoup):
from bs4 import BeautifulSoup soup = BeautifulSoup(init_res.text, "html.parser") csrf_token = soup.find("meta", attrs={"name": "csrf-token"})["content"]
- 从Cookie提取:部分服务会将token存储在Cookie中,键名通常为
csrf_token或XSRF-TOKEN,直接从会话Cookie中获取:
csrf_token = session.cookies.get("XSRF-TOKEN")
二、避免Token过期的核心操作
- 全程复用会话:必须使用同一个Session对象发送所有请求,不能每次请求新建会话——会话Cookie是Token校验的基础,会话不一致会直接触发过期错误。
- 及时使用Token:获取Token后立即发起需要校验的请求(POST/PUT/DELETE等),不要长时间闲置后再用,多数服务的CSRF Token有10~30分钟的有效期。
- 提前刷新Token:如果请求间隔较长,每次发起修改类请求前,先重新获取一次最新Token,再携带新Token发送请求。
三、正确传递Token的两种方式
- 请求头传递:将Token放入
X-CSRF-Token或X-XSRF-TOKEN请求头(严格匹配服务要求的字段名),示例:
headers = {"X-CSRF-Token": csrf_token} res = session.post("https://目标域名/目标接口", headers=headers, data=请求数据)
- 请求体传递:部分服务允许将Token放在请求体的
_csrf或csrf_token字段中,比如表单提交场景:
data = {"username": "test", "password": "123456", "_csrf": csrf_token} res = session.post("https://目标域名/登录接口", data=data)
四、额外排查方向
- 检查Cookie状态:CSRF校验依赖会话Cookie,确保请求没有禁用Cookie,且会话Cookie正常携带。
- 核对字段大小写:部分服务对请求头/参数名的大小写敏感,比如
X-CSRF-Token和x-csrf-token可能不通用,严格按照服务文档或抓包结果传递。 - 查看服务端日志:若以上操作均无效,联系服务端运维查看Token校验的具体失败日志,确认是Token过期、不匹配还是存在IP/UA等额外校验规则。
内容的提问来源于stack exchange,提问作者vengateshwaran Nadarajan
相关产品推荐
相关产品推荐

