背景描述:使用idea2019,tomcat 1.7.06。编写接口通过postman post请求参数乱码问题。
废了多半天的时间解决这个问题。通过postman 参数为{"statisticalCaliber":"北京"} 传递到后台(
@RequestMapping(value = "/usersInfo", method = RequestMethod.POST, headers = "Accept=application/json;charset=UTF-8") //
@ResponseBody
public Object usersInfo(HttpServletRequest request,HttpServletResponse response) throws Exception {}
)
后台以流的形式接收。
public static JSONObject getMsgObject(HttpServletRequest request){ try { String str = readRaw(request.getInputStream()); String result = StringEscapeUtils.unescapeHtml(str); if(StringUtils.isNotBlank(result)){ JSONObject jsonData = JSONObject.fromObject(result); return jsonData; }else{ return null; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } }
public static String readRaw(InputStream inputStream) { String result = ""; try { ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) != -1) { outSteam.write(buffer, 0, len); } result = new String(outSteam.toByteArray(), "UTF-8"); outSteam.close(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } return result; }
后台接收为一个中文变成2个?并且 双引号变成"。百度了很多资料都不行。下面是我整理的解决办法,亲测有效。
getMsgObject方法就是返回的参数json。
1、首先是编辑器的乱码,这个很好解决,file->settings->appearence里面有个Use custom font设置成支持中文的字体的 -->Microsoft Yahei(idea本身的字体可能导致控制台中文乱码)。
2、在 idea下 file -> setting -> editor -> file encodings -> global encoding ,project encoding及properties的编码设置为utf-8。
3、File->Other Settings->Default Settings ->Editor->File Encodings。
4、将项目中的.idea文件夹中的encodings.xml文件中的编码格式改为uft-8,检查一下。
5、File->Settings->Build,Execution,Deployment -> Compiler -> Java Compiler 设置 Additional command line parameters选项为 -encoding utf-8。
6、打开idea的tomcat 配置,在运行配置上加上 VM options 加上:-Dfile.encoding=UTF-8。保存。
7、idea bin目录下的idea64.exe.vmoptions(64位系统,32位配置idea.exe.vmoptions),在文件末尾添加:
-Dfile.encoding=UTF-8。这是网上大多数的说法,但是通过HELP->Edit Custom VM OPtions中加 -Dfile.encoding=utf-8打开看的话,之前的设置并没有设置成功,可能是破解等其他原因。所以再次通过HELP->Edit Custom VM OPtions中
加 -Dfile.encoding=utf-8 。关闭所有的idea,重启,这个很重要。
8、启动项目,发现json中文参数乱码问题解决了,但是双引号为" 的问题还存在。
通过
StringEscapeUtils.unescapeHtml(str); 解决。
9、json参数的解析正常了,但是idea的启动以及报错日志乱码。
去Tomcat安装目录下 的conf文件夹去Tomcat安装目录下 的conf文件夹找到logging.properties文件,修改java.util.logging.ConsoleHandler.encoding =utf-8为 java.util.logging.ConsoleHandler.encoding = GBK;
10、重启。启动日志不乱码了,但是报错日志乱码。修改为java.util.logging.ConsoleHandler.encoding =utf-8
文件解决。
11、另外这只是针对上面的这种情况的解决办法,发生上述问题其实是因为对postman原理不是很了解,也可以用另外一种方法。
@RequestMapping(value="/search",method=RequestMethod.POST) @ResponseBody public void doSearchPost(HttpServletRequest request,HttpServletResponse response) throws Exception{}
只不过postman使用时用下面这种调用,参数可以正常接收
以上为我本次遇到乱码的全部解决方案,至于原理还得继续学习。希望对大家有所启发和帮助。