当前位置: 首页 > 测试知识 > 解决JMeter脚本乱码与重定向问题终极方法
解决JMeter脚本乱码与重定向问题终极方法
2026-07-22 作者cwb 浏览次数76

要彻底解决JMeter的乱码和重定向问题不能只靠界面临时调一调,必须从全局配置、启动参数、元件设置三个方面根治。


一、乱码问题

JMeter 乱码主要出现在请求发送、响应显示、CSV 文件读取、BeanShell/JSR223 脚本这几个地方,逐一解决:


1. 全局修改 jmeter.properties

找到 JMeter 安装目录下的 bin/jmeter.properties,修改或增加以下配置,改完必须重启JMeter:


properties

# 响应内容默认显示编码(查看结果树、断言等)

sampleresult.default.encoding=UTF-8

# CSV Data Set Config 默认文件编码

csvdataset.file.encoding_list=UTF-8

# BeanShell 脚本默认编码

beanshell.sampler.encoding=UTF-8

# 如果还用到其他编码,可同时列出,如:UTF-8,GBK


重启后,所有新添加的取样器、CSV 元件都会以 UTF-8 展示响应和读取文件。


2. JVM 启动编码

在 JMeter 启动脚本中增加 UTF-8 的 JVM 参数,防止 JVM 使用系统默认编码:

Windows:编辑 jmeter.bat,在开头找到 set JVM_ARGS= 行,改为:


bat

set JVM_ARGS=-Dfile.encoding=UTF-8


Linux/Mac:编辑 jmeter 或 jmeter.sh,添加:


bash

export JVM_ARGS="-Dfile.encoding=UTF-8"


如果是在命令行直接启动,也可以用:


bash

jmeter -Dfile.encoding=UTF-8


3. HTTP 请求内容编码

处理发送中文参数乱码(比如 POST 表单或 JSON):

在 HTTP 请求 取样器中,Content encoding 填 UTF-8。

如果是 JSON 请求,添加 HTTP Header Manager 并设置:


text

Content-Type: application/json; charset=UTF-8


如果是普通表单(非 multipart),不要勾选“Use multipart/form-data for POST”,并保证参数的编码?选项按需设置,一般保持默认即可,Content-Type 会决定编码。


4. CSV 文件读取乱码

用 Notepad++ / VSCode 把 CSV 文件另存为 UTF-8 无 BOM 格式。

在 CSV Data Set Config 中,File encoding 确定选择 UTF-8(如果下拉没有,可手动输入 UTF-8)。

如果之前已在 jmeter.properties 设置了 csvdataset.file.encoding_list=UTF-8,这里新建配置时会自动选中。


5. BeanShell / JSR223 脚本乱码

方案:把脚本内容直接贴在元件文本框内,而不用Script file引用外部文件,这样受JVM 编码控制。

如果必须引用外部文件,在JSR223 Sampler 的 Script file 框右侧有一个编码下拉框,选择UTF-8。同时保证外部脚本文件本身是UTF-8 编码。

在 jmeter.properties 设置 beanshell.sampler.encoding=UTF-8 对 BeanShell 同理生效。


6. 查看结果树临时调整(仅用于调试)

如果已乱码但不想重启,可在结果树选中响应,在 Text 视图下拉框手动选择 UTF-8。这只是临时查看,下次还会还原。

做到全局属性、JVM 参数、元件编码三统一为 UTF-8,乱码问题可彻底清除。

二、重定向问题解法

JMeter 的重定向默认是自动跟随,这会导致中间响应丢失、POST 变 GET、Cookie 传递异常、循环重定向报错等。生产级脚本请必须关闭自动重定向,手动处理。


1. 关闭自动重定向

全局设置:添加 HTTP Request Defaults,把 Follow Redirects 勾选去掉(即设置为不跟随),当前线程组所有请求默认不再自动跳转。个别取样器可单独再开启包括。

单个请求:直接在 HTTP Request 里取消 Follow Redirects。

关闭后,服务器返回 3xx 时,JMeter 会将其作为正常的取样器结果,可以看到完整的响应头。


2. 手动提取重定向地址

在产生重定向的请求上右键,添加 后置处理器 - Regular Expression Extractor:

Apply to:勾选 Main sample and sub-samples 或 Main sample only,看重定向响应的位置,一般只勾选主 sample

Field to check:选择 Response Headers

Reference Name:如 redirect_url

Regular Expression:提取 Location 头,如 Location: (.*) 或更严格 Location:\s*(.+)

Template:$1$

Match No.:1


这样就能拿到完整的跳转URL,可能是相对途径或绝对途径。


3. 构造下一个请求

新建一个 HTTP Request:

Server Name or IP 和 Path:如果提取的是绝对 URL,可直接在 Path 中填完整地址;如果是相对途径,则要拼上服务器基础部分。可以使用 变量 ${redirect_url},并注意 URL 拼接:

相对途径:把提取的 Location 放到 Path 里,配合 HTTP Request Defaults 里的协议、服务器名。

绝对 URL:在 Path 里填 ${redirect_url},并在请求的 Protocol、Server Name 留空,JMeter 也能分析(但更建议用 HTTP Request Defaults 统一处理)。

方法:一般重定向后应使用 GET(除非确定是 307/308 且业务需要 POST)。直接把方法选为 GET。

Cookie:只要 HTTP Cookie Manager 放在该线程组下,JMeter 会自动在后续请求中带上之前获得的 Cookie,无需额外提取 Set-Cookie。

Referer:有些网站会检查,可在下一个请求添加 HTTP Header Manager,设置 Referer: ${url},url 为上一个请求的完整地址。


4. 解决过多重定向或循环重定向报错

如果关闭自动重定向前就一直报 Too many redirects,可以在 jmeter.properties 调整最大重定向次数默认20:


properties

# HTTPClient4 实现的最大重定向次数

httpclient.max_redirects=50

# 防止重定向循环的阈值

httpclient.loop_redirects.maximum=50

调整后重启 JMeter。但更推荐直接关闭自动重定向手动控制,避免不可控的循环。


5. 处理 POST 转 GET 后参数丢失

关闭自动重定向后,可以决定是不是真的需要用 GET 重访新地址,还是需要带着 Token 重新 POST。一般按 HTTP 语义,重定向后用 GET 即可;如果业必须须用 POST(如某些 API 的 307 响应),那就把下一个请求方法保留为 POST,并重新构造 Body。这都比自动跟随更灵活。


永远取消Follow Redirects,通过提取Location手工发下一个请求。这样可以拿到中间所有数据、控制Cookie和Referer,避免一切由自动跳转引发的错误。


三、一劳永逸的配置检查清单

jmeter.properties:

sampleresult.default.encoding=UTF-8

csvdataset.file.encoding_list=UTF-8

beanshell.sampler.encoding=UTF-8

可选 httpclient.max_redirects=50,但一般结合手动重定向无需改。

JMeter 启动命令增加 -Dfile.encoding=UTF-8。

所有 HTTP Request 的 Content encoding 设为 UTF-8,Header Manager 中 Content-Type 确定 charset。

CSV 文件 UTF-8 无 BOM,元件中编码选 UTF-8。

线程组下放置 HTTP Request Defaults,取消 Follow Redirects。

遇到 3xx 的请求,一律加正则提取器拿 Location,然后创建新的 HTTP Request(GET),并复用同一个 Cookie Manager。


按上面搞完,JMeter 脚本的乱码和重定向问题就能从根本上解决,不再反复折腾。


文章标签: 软件测试 测试工具
咨询软件测试