- 情景描述
我们的前端页面编码方式为UTF-8,数据库连接编码也为UTF-8,Controller接收数据时,Post请求出现中文乱码,Get请求却正常,显然,保持统一的编码方式是我们整个应用保持数据统一的重要因素。
- 原因分析
* 使用post方式不乱吗,get方式就会出现乱码
* 原因:编码和解码方式不一致
* tomcat版本:8.5及以上版本
* get请求方式,request对象使用的字符集默认为utf-8
* post请求方式:request对象使用的编码方式为ISO8859-1
原文链接:https://blog.youkuaiyun.com/weixin_42458708/article/details/92637806
其实,我们的问题和上面的问题恰好相反,但原理是一样的,如果我们前端的数据是经过UTF-8编码的,那么get自然不会有问题,而post就会出问题,和tomcat默认的编码ISO8859-1对不上,所以,我们只需要将post请求的编码处理改为UTF-8即可。
- 解决方案
情况一:对于post请求,在web.xml中添加编码过滤器,将post请求的编码改为UTF-8
tomcat中的web.xml对该过滤器的说明
<!-- A filter that sets character encoding that is used to decode --> <!-- parameters in a POST request --> <!-- <filter> <filter-name>setCharacterEncodingFilter</filter-name> <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <async-supported>true</async-supported> </filter> -->
<!-- 编码过滤器配置 ,对post请求有效-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param><!-- 针对request-->
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param><!-- 针对response -->
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
情况二:对于get请求,通过在tomcat.server.xml中设置URIEncoding="UTF-8"解决
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"/>