解析一次get请求后台解码中文乱码的问题
今日遇到一个项目组中个人独有的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中没有配置指定的中文解码字符集,于是使用默认的解码字符集解码中文时产生了乱码情况。
匆匆总结,错误感谢指正
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!