要彻底解决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 脚本的乱码和重定向问题就能从根本上解决,不再反复折腾。