今天在用jmeter 写脚本时发现查看结果树request post请求中文参数值是乱码,故记录下解决过程。

解决过程如下: 
1、修改本地配置文件

因为此处的数据,还没有发送出去,所以,肯定是这个变量的编码和jmeter内部的一些编码不一致导致。然后,尝试修改jmeter.properties的配置项:

sampleresult.default.encoding=utf-8
  • 1

重启jmeter后,依然还是乱码。

2、修改消息头和请求体编码

 
同时把消息头和请求体的编码修改为utf-8,结果依然不生效。

3、查看jmeter源码

因为是request请求体的内容,所有先在下面的包中进行查看:

    public static String decodeQuery(String query) {
if (query != null && query.length() > 0) {
try {
query = URLDecoder.decode(query, "ISO-8859-1"); // 此处的字符编码为ISO-8859-1 ,将其改为utf-8
return query;
} catch (IllegalArgumentException arg1) {
log.warn(
"Error decoding query, maybe your request parameters should be encoded:"
+ query, arg1);
return null;
} catch (UnsupportedEncodingException arg2) {
log.warn(
"Error decoding query, maybe your request parameters should be encoded:"
+ query, arg2);
return null;
}
} else {
return null;
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

eclipse 安装反编译插件(Help——Eclipse Marketplace 输入 Decompiler 搜索并安装此插件–安装重启之后结果) 

4 反编译RequestViewHTTP.class,将ISO-8859-1 ,将其改为UTF-8,然后编译,使用最新class打包替换原来jar。

重启jmeter,再次请求时,请求参数如下: 

再说下HTTP协议录制中文问题 
在进行HTTP协议测试过程中,我们往往会借助JMeter为我们提供的HTTP代理服务器进行测试脚本的录制,一个典型的录制计划如如下图:

由于在浏览器中的showName项输入了中文,因此,在录制所生成的HTTPSampler的POST表单中出现了中文乱码情况。 
我们可以在org.apache.jmeter.protocol.http.proxy包中的org.apache.jmeter.protocol.http.proxy.DefaultSamplerCreator.class源文件中发现如下代码:

            if (!StringUtils.isEmpty(contentEncoding)) {
postData = new String(request.getRawPostData(), contentEncoding);
} else {
postData = new String(request.getRawPostData(), "ISO-8859-1");
//将ISO-8859-1编码改为UTF-8
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

会发现造成中文乱码的原因是无法从Content encoding中读取信息,而使用了默认的ISO-8859-1编码,因此,我们只需要指明我们中文编码即可解决上述问题,最简单的方案是注释掉上面那段代码,设置一个全局的默认中文编码,如下方法: 
postData = new String(request.getRawPostData(), “utf-8”);

之后将新编译的DefaultSamplerCreator.class替换E:\jmeter\apache-jmeter-2.11\lib\ext下的ApacheJMeter_http.jar文件中的原class文件. 
再次录制,可以看到能够正常显示中文了.

再说下Jmeter HTTP请求中的Content encoding选项 

我们知道在现有的JMeter版本中HTTPSampler主要可以通过选择Java、HttpClient3.1和HttpClient4来设置最终模拟HTTP协议与Web服务器交互的真正实现方法。我这里以Java实现方法作为参考,从JMeter源码包org.apache.jmeter.protocol.http.sampler中查看源代文件PostWriter.java,发现这样一行:

可以看出如果没有设置Content encoding项,JMeter同样是默认为ISO-8859-1编码,一种一劳永逸的方法(这里只是一个针对HTTPSampler的例子,但可以根据此思路扩展到所有需要中文字符编码的Sampler中),我们只需要将默认编码根据中文编码需求更改为utf-8、gb18030等,就可以实现POST正确的中文到Web服务器了。参考如下修改:


String contentEncoding = sampler.getContentEncoding();
if (contentEncoding == null || contentEncoding.length() == 0) {
contentEncoding = "UTF-8";
}
  • 1
  • 2
  • 3
  • 4
  • 5

之后将新编译的PostWriter.class替换E:\jmeter\apache-jmeter-2.11\lib\ext下的ApacheJMeter_http.jar文件中的原class文件. 
这样不写Content encoding为utf-8 ,默认也按照UTF-8处理了。

或者采用简单的方法,就是设置Content encoding项完成中文编码,如下图所示:

解决jmeter 请求参数中文乱码的更多相关文章

  1. JSP中解决获取请求参数中文乱码问题

    分两种情况: 1.获取访问请求参数时乱码 解决方法:构造一个新的String String user = new String(request.getParameter("user" ...

  2. jmeter请求参数中文乱码及无法读取CSV文件解决办法

    解决办法:参考http://blog.csdn.net/u012167045/article/details/70868306 版本:2.6 我是修改请求http请中的编码为Content encod ...

  3. jmeter请求参数中文乱码,解决方法

  4. 使用过滤器(Filter)解决请求参数中文乱码问题(复杂方式)

    前述:      在写这篇笔记之前,对笔记中的设计模式进行介绍:      本篇笔记中将要使用到的设计模式是:装饰(包装)设计模式           (1)装饰(包装)设计模式口诀:         ...

  5. 详解get请求和post请求参数中文乱码的解决办法

    首先出现中文乱码的原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的. 一,get请求参数中文乱码的解 ...

  6. get请求和post请求参数中文乱码的解决办法

    get请求参数中文乱码的解决办法 在tomcat的server.xml里的Connector加个URIEncoding="UTF-8",把 <Connector connec ...

  7. java web项目get,post请求参数中文乱码解决

    [转载]原文地址:https://www.cnblogs.com/tom-plus/p/6392279.html 在开发过程中,有时候会碰到get,post请求参数中文乱码. 原因: Http请求传输 ...

  8. SpringMVC学习系列-后记 解决GET请求时中文乱码的问题

    SpringMVC学习系列-后记 解决GET请求时中文乱码的问题 之前项目中的web.xml中的编码设置: <filter> <filter-name>CharacterEnc ...

  9. 使用SpringMVC参数传递时,解决get请求时中文乱码的问题

    问题描述: 使用SpringMVC参数传递时, 遇到get请求中文信息时,页面应答会显示中文乱码. 解决办法: 一,  我们需要把request.getParameter(“参数名”)获取到的字符串先 ...

随机推荐

  1. 实现Servlet接口

    1 右键项目->Build Path->Configure Build Path 2 Add Library...->Server Runtime 3 Apache Tomcat-& ...

  2. 数据挖掘竞赛kaggle初战——泰坦尼克号生还预测

    1.题目 这道题目的地址在https://www.kaggle.com/c/titanic,题目要求大致是给出一部分泰坦尼克号乘船人员的信息与最后生还情况,利用这些数据,使用机器学习的算法,来分析预测 ...

  3. 微信小程序 ----- this.getOpenerEventChannel is not a function

    小程序 添加新的功能, 页面跳转后,通过事件的发布订阅,实现 from => to 或者 to=> from 数据传递 1. 跳转到指定页面. 通过 wx.navigateTo() .请参 ...

  4. AT2292 Division into Two

    题目 不妨认为\(A>B\). 首先判一下无解. 设\(f_i\)表示\(A\)集合最后选第\(i\)个数的方案数. 转移的话枚举一下从哪个\(j\)转移过来. 显然\(j\)需要满足以下条件: ...

  5. 声明一个LIst类型的数组

    ArrayList[] graphArrayList = new ArrayList[4]; for(int i=0;i<graphArrayList.length;i++){ graphArr ...

  6. yii框架RBAC權限管理

    基于角色的存取控制 (RBAC) 基于角色的存取控制 (RBAC) 提供了一个简单而强大的集中式存取控制机制. 详细的关于 RBAC 和诸多传统的存取控制方案对比的详情,请参阅 Wikipedia. ...

  7. 2015 四川省赛 C Censor(哈希 | KMP)

    模式串为子串 KMP /* @author : victor */ #include <bits/stdc++.h> using namespace std; typedef long l ...

  8. Oracle及SQLPLUS使用笔记

    Oracle及SQLPLUS使用笔记 自己之前粗粗的学过MySQL,学校用的是Oracle,学生使用sqlplus,这是个命令行界面的数据库管理软件(为了学习嘛,不用图形化可以理解),这里记录一些使用 ...

  9. JVM 之类加载器

    一.什么是 JVM JVM(Java Virtual Machine)是一个可以执行 Java 字节码文件(即 .class 文件)的虚拟机进程.当 Java 源文件能被成功编译成 .class 文件 ...

  10. sql:union 与union的使用和区别

    SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...