SpringMVC中文乱码问题:用CharacterEncodingFilter设置get/post请求字符集;web.xml设置init-param是怎么传到该过滤器属性的源码解释;


今天在学习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.然后设置CharacterEncodingFilterencoding属性为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过滤器的属性的?

(待写,干饭先)



在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值