`

解決 Tomcat 5 中文参数提交问题

阅读更多
实际运用 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[i] = (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。


分享到:
评论

相关推荐

    tomcat5中文问题完美解决

    总结,解决Tomcat5中的中文问题,关键在于统一请求处理的字符编码,并确保服务器端和客户端的编码一致。通过上述两种方法,可以有效地解决POST和GET请求的中文乱码问题,实现中文数据的正常显示。

    如何解决Tomcat下中文乱码问题?

    总结来说,解决Tomcat下的中文乱码问题,关键在于确保JSP页面的编码与服务器设置一致,并在处理表单提交时正确设置请求的字符编码。在实际开发中,推荐使用UTF-8作为统一的编码标准,因为UTF-8能够兼容各种语言,...

    Tomcat 中文问题及解决方法总结

    ### Tomcat 中文问题及解决方法总结 ...通过以上方法,可以有效解决Tomcat中文环境中出现的乱码问题,提高开发效率并保证系统的稳定性。对于不同的应用场景和版本,可以选择合适的解决方案来应对中文乱码的问题。

    Tomcat中文问题之完美解决

    本文介绍了两种解决Tomcat中文乱码问题的有效方法:一是通过Filter统一设置字符编码;二是直接修改`server.xml`文件中的配置。这两种方法都可以有效地解决中文乱码问题,开发者可以根据实际情况选择合适的方法进行...

    如何解决Tomcat下中文乱码问题?文.pdf

    在使用Apache Tomcat服务器运行Java Web应用程序时,有时会遇到中文...通过以上步骤,通常可以有效地解决Tomcat下的中文乱码问题。如果问题依然存在,可能需要进一步检查服务器配置、网络传输过程中的编码转换等环节。

    Tomcat中Get和Post出现乱码的解决办法

    在 JSP 程序中,当我们使用 GET 或 POST 方法提交中文信息时,可能会出现乱码问题。这是因为 Tomcat 对于 GET 和 POST 方法的编码处理方式不同。对于 POST 方法,Tomcat 会使用 request.setCharacterEncoding 方法...

    解决Tomcat+MySql+Struts的中文问题

    总结来说,解决Tomcat+MySql+Struts的中文问题,主要包括以下几个步骤: 1. 确保HTML/JSP页面使用支持中文的charset,如GBK或UTF-8。 2. 使用过滤器处理POST请求,设置请求的字符编码。 3. GET请求一般无需特殊处理...

    解决Tomcat修改get提交请求乱码问题

    本文主要讨论如何解决Tomcat在处理GET提交请求时出现的乱码问题。 首先,我们要明白GET请求与POST请求的区别。GET请求通常用于获取资源,而POST请求则用于向服务器发送数据。对于POST请求,Spring框架提供了`...

    用Filter来解决中文表单提交问题

    在`TomcatFormFilter`的代码中,我们看到这个过滤器主要解决了Tomcat服务器下中文表单提交时的乱码问题。它创建了一个名为`Request`的内部类,该类继承自`HttpServletRequestWrapper`,目的是为了封装原始的`...

    android客户端向服务器提交请求的中文乱码问题

    在Android客户端向服务器提交请求时,遇到中文乱码问题是一个常见的困扰。...在本例中,使用`URLEncoder`和`URLDecoder`进行编码和解码,有效地解决了Android客户端与Tomcat服务器之间的中文乱码问题。

    tomcat与servlet乱码解决办法

    ### Tomcat与Servlet乱码问题解析及解决方案 #### 一、引言 在Web开发过程中,经常遇到的一个问题就是字符编码的问题,特别是在处理中文字符时,如果编码设置不当,很容易出现乱码的情况。本文主要围绕Tomcat服务器...

    配置web-xml解决中文乱码问题.pdf

    首先,需要确定中文乱码问题不是由浏览器引起的,然后讨论了 Tomcat 服务器配置和数据库 bean 配置中的一些解决方案。 一、浏览器配置问题 在讨论解决方案之前,需要确定中文乱码问题不是由浏览器引起的。在使用 ...

    tomcat request.getParameter 乱码

    通过对Tomcat服务器的适当配置,可以有效地解决`request.getParameter`方法在处理中文参数时出现的乱码问题。具体而言,通过在`server.xml`文件中修改`Connector`元素的相关属性,以及在程序中设置合适的字符编码,...

    tomcat字符编码总结

    本文将深入探讨Tomcat环境中字符编码的相关知识点,并通过实际案例分析如何有效解决中文乱码问题。 #### 二、Tomcat与字符编码的基本概念 **1. 字符编码简介** - **ASCII**: 最早的字符编码标准,只能表示英文等...

    Tomcat PostGet 中文編碼處理方法

    本文将深入探讨如何在Tomcat环境下正确地处理POST与GET请求中的中文字符,帮助开发者更好地理解和解决相关问题。 #### 一、理解中文字符编码 在讨论具体的解决方案之前,首先需要了解几个基本概念: 1. **Unicode...

    解决jsp提交乱码的问题

    ### 解决JSP提交乱码的问题 在进行Web开发时,经常会遇到中文字符编码的问题,尤其是在使用JavaServer Pages(JSP)技术时。本篇文章将详细介绍如何解决JSP页面提交时出现的乱码问题,包括GET请求和POST请求两种...

    struts2 使用action属性接收中文参数(post提交)

    压缩包文件“Struts2_1000_CharacterEncoding”可能包含了示例代码、配置文件或者测试用例,帮助读者理解并解决Struts2框架下处理中文POST参数的具体实现。通过学习这些内容,开发者能够确保在处理多语言环境下,...

    Tomcat 5.5中应用开发过程中中文乱码的解决.docx

    通过这些方法,我们可以有效地解决Tomcat 5.5在处理中文数据时可能出现的乱码问题。然而,随着技术的发展,现在的Tomcat版本已经支持更广泛的字符编码,并且提供了更方便的配置选项,开发者在遇到类似问题时,应根据...

    解决Struts提交中文出现乱码和提交日期型数据报错的问题

    首先,我们来讨论如何解决Struts提交中文出现乱码的问题。中文乱码通常与字符编码设置有关。在Struts中,主要涉及到以下几个环节: 1. **请求编码**:确保Web应用的`web.xml`配置文件中,`filter`部分的`filter-...

Global site tag (gtag.js) - Google Analytics