解析一次get请求后台解码中文乱码的问题

文章讲述了项目组遇到的中文搜索get请求参数乱码问题,通过分析发现是由于Tomcat默认的ISO-8859-1解码导致。文章详细解释了get和post请求的差异,以及URIEncoding和useBodyEncodingForURI的作用。
摘要由CSDN通过智能技术生成

今日遇到一个项目组中个人独有的bug,系统输入中文搜索内容搜不出来,组员都可以,从前台查到后台,发现前端的获取值和传递值都没什么问题,到了后台,接收的中文参数直接是个乱码,但是想到之前也有传递过中文参数,都没事,这次怎么不行了。再看一眼,前端是get请求,之前都是post提交的表单提交,这样一下豁然开朗,先说结论:

本地tomcat没有配置指定的解码字符集,导致get请求带回来的中文参数使用默认的iso-8859-1解码,当然解码不出来。

解决办法:

找到tomcat目录下的conf文件夹下的serve.xml文件,在此处添加这样一段配置:

URIEncoding="UTF-8"

问题迎刃而解。

既然看到这个问题,那就展开记录下相关的get与post请求的差别以及问题产生的原因,方便后续追溯。

首先是post与get请求的差别:

get提交会将请求参数拼接在URL地址的后面,显示在地址栏中,相对不安全,像这样:

        localhost:8080:/ceshi/user.htm?euserName=测试       

post提交不会将参数拼接在地址栏后面,而是通过请求实体将参数发送给服务器,相对来说较为安全

对于请求参数的编码方式,这两个请求的差别:

get请求使用的是URIEncoding编码,post请求使用的是useBodyEncodingForURI。

对于URIEncoding与useBodyEncodingForURI的区别,引用官网的描述是:

URIEncoding:

This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.

指定在 %xx 解码 URL 后用于解码 URI 字节的字符编码。如果未指定,将使用 ISO-8859-1。

useBodyEncodingForURI:

This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitly set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.

这个参数指定了是否应该使用contentType中指定的编码来代替URIEncoding.这个设置是为了与Tomcat4.1.x兼容,在Tomcat4.1.x中,contentType中指定的编码,或者使用Request.setCharacterEncoding方法显式设置的编码也被用于URL参数.默认值是.false

用人话解释一下这个定义就是:

get请求的URIEncoding编码会对参数进行转码,

而post请求的useBodyEncodingForURI编码会依据request.setCharacterEncoding这个属性来判断是否对参数进行编码,默认情况下这个属性是false,也就是不不转码

这也就解释了为啥这次我用get请求参数乱码,而之前一直用的表单提交的post请求一直没事。

最后再复现下这次问题细节过程就是:

系统页面发起get请求

  localhost:8080:/ceshi/user.htm?euserName=测试 

在浏览器中发送之前,会被转码再发送,请求头中可能是这样:

        localhost:8080:/ceshi/user.htm?euserName=%E5%90%9B%E5%B1%B1

但是后台解密时,由于tomcat中没有配置指定的中文解码字符集,于是使用默认的解码字符集解码中文时产生了乱码情况。

匆匆总结,错误感谢指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值