Karate测试中跨场景传递CSRF Token与JSESSIONID的方法咨询
实现后续接口携带指定JSESSIONID和CSRF Token的方案
这其实是典型的先获取校验凭证,再复用凭证调用后续接口的场景,我来给你拆解具体的实现步骤:
第一步:获取JSESSIONID和CSRF Token(调用path2)
首先必须先调用path2的GET请求,拿到后续请求需要的两个关键凭证:
- 发送GET请求到
path2,请求头必须包含Accept和Content-Type(比如设置为application/json,具体根据接口要求调整) - 从响应中提取两个信息:
- JSESSIONID:从响应的Cookie中提取(接口会返回包含该值的Cookie)
- CSRF TOKEN:从响应体中提取(比如接口返回JSON格式的
{"csrfToken": "xxxxxx"},或者HTML页面中的隐藏字段,具体看返回结构)
举个Python代码示例(用requests库):
import requests # 初始化会话,自动管理Cookie session = requests.Session() # 调用path2获取凭证 get_token_url = "path2" headers = { "Accept": "application/json", "Content-Type": "application/json" } response = session.get(get_token_url, headers=headers) # 提取CSRF Token(假设响应是JSON格式) csrf_token = response.json().get("csrfToken") # 提取JSESSIONID(session会自动保存Cookie,后续请求可直接复用) jsessionid = session.cookies.get("JSESSIONID")
第二步:在后续接口中携带凭证
不管是调用场景1的path1 POST接口,还是场景2的任意接口,都需要携带这两个凭证:
- JSESSIONID:推荐使用会话(Session)自动携带,或者手动在请求头的
Cookie字段中添加JSESSIONID=xxxxxx - CSRF TOKEN:通常放在请求头中(比如
X-CSRF-Token字段,具体字段名以系统要求为准),部分系统也可能要求放在表单参数里
以调用path1的POST接口为例:
# 调用path1的POST请求 login_url = "path1" # 表单字段 form_data = { "Username": "your_test_username", "Password": "your_test_password" } # 请求头需要包含Accept、Content-Type,以及CSRF Token request_headers = { "Accept": "application/json", "Content-Type": "application/x-www-form-urlencoded", "X-CSRF-Token": csrf_token } # 使用之前的session发送请求,自动携带JSESSIONID的Cookie login_response = session.post(login_url, data=form_data, headers=request_headers)
其他工具的实现方式(比如Postman)
如果用接口测试工具,也可以通过环境变量来复用凭证:
- 发送
path2的GET请求,在Tests标签页中编写脚本提取JSESSIONID和CSRF Token,并存入环境变量:// 提取CSRF Token(假设响应是JSON) let csrfToken = pm.response.json().csrfToken; pm.environment.set("csrfToken", csrfToken); // 提取JSESSIONID let jsessionid = pm.cookies.get("JSESSIONID"); pm.environment.set("jsessionid", jsessionid); - 后续请求中,在请求头里引用环境变量:
- Cookie字段:
JSESSIONID={{jsessionid}} - CSRF Token字段:
X-CSRF-Token={{csrfToken}}
- Cookie字段:
注意事项
- 要注意凭证的有效期,如果JSESSIONID过期或者CSRF Token失效,需要重新调用
path2获取新的凭证 - 确保CSRF Token的传输方式和字段名与系统要求一致,部分系统可能会用
Csrf-Token或其他字段名 - 不要随意修改JSESSIONID和CSRF Token的来源,必须严格使用
path2返回的值,否则会被系统拦截
内容的提问来源于stack exchange,提问作者Anupama
相关产品推荐
相关产品推荐

