今天在学习SpringMVC时遇到中文乱码的问题,这里记录一下给有需要的人
本文地址:https://blog.csdn.net/weixin_54430656/article/details/122392223
问题:
1. tomcat 8.0以前的版本get,post都有中午乱码问题
如果你用get或者post请求将表单提交到tomcat8.0以前的版本的服务器时,你会发现get和post都有中文乱码问题
2. tomcat 8.0版本以后get没有中午乱码问题,post有
而如果你用Tomcat8.0以后版本的服务器,你会发现get的中文乱码问题解决了,而post请求的中文乱码问题还在,所以为什么get请求好了,而post没有?
3. 在SpringMVC中怎么解决post请求中文乱码问题?
4. CharacterEncodingFilter的工作原理
大概是怎么样的?web.xml中用init-param设置的参数是怎么传到CharacterEncodingFilter过滤器的属性的?翻翻源码?
在SpringMVC中对post设置字符集需要在web.xml通过init-param标签对CharacterEncodingFilter过滤器设置其属性,那为什么用init-param标签设置的属性能最终传递到CharacterEncodingFilter这个类?
前置知识:
1.编码解码
对于一段01二进制串,最初使用什么字符集编码的,就需要用对应的字符集解码,就像密文用什么密钥加密,就得用什么密钥解密一样(好像在说废话)
2.浏览器对发起的请求的编码方式
对于我们用浏览器发情的get/post请求等,浏览器都会用UTF-8进行编码,然后在发送到服务端,可以打开F12,看一下
分析:
1. tomcat 8.0以前的版本get解决中午乱码问题的解决
需要到tomcat安装目录的tomcat/config
目录下的service.xml
文件配置对URI的解码方式,找到对应标签,写上对应画红圈部分,但是这只能解决get请求,post请求的解决看下文
URIEncoding="UTF-8"
为什么需要在这里设置这个URIEncoding,因为他默认是用 ISO-8859-1 进行解码的,tomcat官方的说明文档有相关的说明
我们可以打开tomcat的官网:
https://tomcat.apache.org
然后点击8.5版本的文档看一下,然后在修改一下浏览器上面的地址栏,把版本改到7.0,以此来跳转到7.0版本的说明文档(暂时没有找到直接进入7.0版本的入口)
https://tomcat.apache.org/tomcat-8.5-doc/index.html
https://tomcat.apache.org/tomcat-7.0-doc/index.html
然后按快捷键CTRL
+F
查找server.xml
,
https://tomcat.apache.org/tomcat-7.0-doc/config/index.html
进入该页面后点击侧边的HTTP,
https://tomcat.apache.org/tomcat-7.0-doc/config/http.html
进入该页面后继续查找URIEncoding
,我们就可以查到这一行
可以看到,它已经明确指出,默认会对URI进行 ISO-8859-1解码,而我们浏览器传上来的时是用UTF-8编码的,这自然就有乱码问题了,所以需要在service.xml
文件设置URIEncoding
2. tomcat 8.0版本以后的不需要进行上面这部分的设置了
tomcat 8.0版本以后的不需要进行上面这部分的设置了,因为tomcat把“UTF-8”设置为默认的了,除了手动敲个代码写个Test验证一下以外,tomcat官方的说明文档可以证实这一点,按照刚刚上面提到的查找路径,我们可以看到在tomcat 8.0版本关于URIEncoding
的说明是下面这样子的
https://tomcat.apache.org/tomcat-8.0-doc/config/http.html
所以这也就说明了为什么tomcat 8.0版本以后get请求不用再对中文进行特别设置了
不过这里只是说URI会使用UTF-8,但是其实他在对POST请求中body部分进行解析的时候用的还是 ISO-8859-1,所以POST还是会出现中文乱码的,还需要我们做一些特别的处理,下面看看SpringMVC是怎么解决的
3. SpringMVC中post的解码字符集为UTF-8
1.首先是在web.xml文件中设置
CharacterEncodingFilter
过滤器及其拦截路径
2.然后设置CharacterEncodingFilter
的encoding
属性为UTF-8
<!--配置springMVC的编码过滤器-->
<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>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4. CharacterEncodingFilter的工作原理大概是怎么样的?web.xml中用init-param设置的参数是怎么传到CharacterEncodingFilter过滤器的属性的?
(待写,干饭先)