用postman的form-data方式,测试一个文件上传功能时,Java后台接受中文参数乱码的解决过程
一、正如标题所说的中文乱码问题,如下图;

二、用postman的“Body”--“form-data”方式提交键值对,其中有提交文件上传的key-value;

注:其实选择"Body"--"form-data"选项就不用在“Headers”中设置Content-Type:multipart/form-data了;如下图

三、使用Tomcat作服务时,文件上传需要在web.xml文件中添加如下配置:
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
如图:

否则,会抛出异常:
com.sun.jersey.api.client.UniformInterfaceException: PUT http://localhost:8080/xxxxx.txt returned a response status of 403 Forbidden
四、解决请求到后端中文乱码的难缠问题的思路。
1、在Tomcat的server.xml中加上URIEncoding="UTF-8"并没有起到解决中文乱码的作用。

2、另外,在请求到Controller时,在Controller开头加上request.setCharacterEncoding(“UTF-8”); 也不行。
原因是:是在调用Controller之前,前端请求的表单参数(key-value)取出并填充到Controller的方法接收参数中了,也就是POJO或VO参数。如果要使用中文,则需要在取出来的时候就设置好编码UTF-8,取出之后设置就没用了。
那么,可以在请求Controller之前设置编码。因为Controller本质也是一个servlet,要解决这个问题需要在servlet执行之前设置好编码。
五、解决方案:使用一个Filter取出request设置需要的编码,然后配置在web.xml中。
使用SpringMVC内置的 org.springframework.web.filter.CharacterEncodingFilter来设置一个编码filter:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
最后,只需要在web.xml中加上这段配置就可以解决以上所说的中文乱码问题了。

本文介绍如何解决使用Postman测试文件上传功能时,Java后台接收到的中文参数出现乱码的问题。通过在web.xml中配置Tomcat,并利用SpringMVC的CharacterEncodingFilter设置编码,有效避免中文乱码。
1138

被折叠的 条评论
为什么被折叠?



