设为首页 收藏本站
查看: 650|回复: 0

[经验分享] 解決 Tomcat 5 中文参数提交问题

[复制链接]

尚未签到

发表于 2017-1-26 09:52:30 | 显示全部楼层 |阅读模式
实际运用 Tomcat 5.0.19,我们了解在不修改 Tomcat 源代码的状况下,使用者透过 Form submit 的数据将一律以 ISO8859-1 处理,程序设计师必须自行将字符串将转换为 Big5(繁体中文) or GB2312/GBK(简体中文),我们在应用程序中,对所有的 request.getParameter("xx"); 作了 toBig5String() 的处理,理论上,所有的中文问题应该不会出现才对,结果,还是发现某些状况下,中文还是变成乱码!
经过分析整理,我们发现问题出在 QueryString 的解析,以前在 Tomcat 4.x 时代,无论 SUBMIT 时采用 GET or POST,Tomcat server 对 parameters 的处理都采用相同的编码,但在 Tomcat 5.x 版,不知何故,却将 QueryString 的解析独立出来,目前确认,Form 的 Method 采用 GET 及直接将参数写在 URL 上的中文,上传到 Tomcat 时,无论如何转码,都会变成乱码,那怕你事先作过 URLEncode 也一样。
网站上,有人针对这个问题,建议将所有中文改采用 base64 编码,到了 server 上,程序将自行土 base64 decode 回来,确保中文不会发生问题。这样作法当然可以解决这个问题,但是所有网页变成限定要采用 POST,且程序设计师要随时分清楚,那个参数是采用 GET 上传,那个参数是采用 POST 上传,然后再针对不同的方式采用不同的解析,这样的程序一点儿移植性都没有,更别提跨平台、跨国际语言了。
研究 Tomcat 的檔及原始码,我们找到了问题所在及解决的方法,只有按着以下的作法,才能使 Form submit 的资料完全按着 ISO8859-1 的编码,当然,若是全照着 Tomcat 的檔说明去作,肯定还是不行,你还是得加上这个参数到 server.xml 中才行。
解决方案
请先研究 $TOMCAT_HOME/webapps/tomcat-docs/config/http.html 这个说明檔,撷录重点如下:
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.
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 explicitely set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.
上述二个 Tomcat 参数,是设定在 server.xml 中的 http <Connector /> 区块,要解决 QueryString 中文变成乱码的问题,你必须至少设定这二个参数其中之一。
URIEncoding 请设定为 URIEncoding="ISO-8859-1" 指定为 "ISO-8859-1" 编码,让 QueryString 的字符编码与 post body 相同。
useBodyEncodingForURI 这是用来相容 Tomcat 4.x 版的,设定的值是 "true" or "false",意思是指 "要不要让 QueryString 与 POST BODY 采用相同的字符编码 ?",若是设成 true,那也可达到 "ISO-8859-1" 编码的需求。
建议,采用 URIEncoding 的设定,毕竟 useBodyEncodingForURI 的作法是为了兼容 Tomcat 4.X。不过若照原文的说明,理论上这二个参数都不设,Tomcat 也该采用 "ISO-8859-1" 的编码,那为什么还是会有问题呢 ? 我们由 Tomcat Source Code 来看就清楚了。
// 这一段代码是 Tomcat 用來解 QueryString 的,
// 在 org.apache.tomcat.util.http.Parameters 这个类中。
private String urlDecode(ByteChunk bc, String enc)
throws IOException {
if( urlDec==null ) {
urlDec=new UDecoder();
}
urlDec.convert(bc);
String result = null;
if (enc != null) {
bc.setEncoding(enc);
result = bc.toString();
}
else {
CharChunk cc = tmpNameC;
cc.allocate(bc.getLength(), -1);
// Default encoding: fast conversion
byte[] bbuf = bc.getBuffer();
char[] cbuf = cc.getBuffer();
int start = bc.getStart();
for (int i = 0; i < bc.getLength(); i++) {
cbuf = (char) (bbuf[i + start] & 0xff);
}
cc.setChars(cbuf, 0, bc.getLength());
result = cc.toString();
cc.recycle();
}
return result;
}

请特别注意红色区块,当 Tomcat 发现 QueryString 并没有设定 encode 时,并非像文件中所说预设采用 ISO-8859-1 的编码,而是用一段 fast conversion 来处理,才会造成中文问题,所以,还是必须在 Server.xml 中,加上 URLEncoding 的参数设定才行哦。
Connector 的设定范例:
<Connector
debug="0"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
port="80"
redirectPort="8443"
enableLookups="false"
minSpareThreads="25"
maxSpareThreads="75"
maxThreads="150"
maxPostSize="0"
URIEncoding="ISO-8859-1"
>
</Connector>

一般说来,我们在使用 Tomcat 4 透过 GET or POST 的方式传参数时,通常都是使用 Filter 的方式来解决中文传参数的问题。 但是到了 Tomcat 5.0.19 之后,解决中文传递参数时,就必须考虑是使用 GET or POST,两种解决的方式不一样。
如果是使用 GET 的方式传递时,就如同 精灵 兄 的文章所述,或者使用
String name = new String((request.getParameter("name")).getBytes("ISO-8859-1"),"Big5");

若是使用 POST 的方式時,就延用傳統一般解決中文的方式
request.setCharacterEncoding("Big5");

不过当初我最后的做法是使用 Filter 的方式 。
Filter 的做法就是:先判断是使用那种传递方式( GET or POST),假若是用 GET 的方式就采用第一种 code;若使用POST 方式,就采用第二种 code。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-333568-1-1.html 上篇帖子: eclipse搭建JAVA开发平台(Tomcat) 下篇帖子: Tomcat 原理解说:启动过程分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表