`

解決 Tomcat 5.0.19 中文參數傳遞問題

阅读更多
實際運用 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 來看就清楚了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 這一段碼是 Tomcat 用來解 QueryString 的程式,// 在 org.apache.tomcat.util.http.Parameters 這個 class 裡。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;}
<script type="text/javascript"><!----></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
請特別注意紅色區塊,當 Tomcat 發現 QueryString 並沒有設定 encode 時,並非像文件中所說預設採用 ISO-8859-1 的編碼,而是用一段 fast conversion 來處理,才會造成中文問題,所以,還是必須在 Server.xml 中,加上 URLEncoding 的參數設定才行哦。

Connector 的設定範例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Connectordebug="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>



分享到:
评论

相关推荐

    jakarta-tomcat-5.0.19.zip

    【Jakarta Tomcat 5.0.19】是一个经典的Java Web服务器和应用服务器,它在Web应用程序开发和部署领域扮演着重要的角色。Tomcat是Apache软件基金会 Jakarta项目的一部分,作为一个开源项目,它遵循Java Servlet和Java...

    Tomcat-5.0.19

    Apache Tomcat在Java社区中占有重要地位,因为它作为Java EE(现在称为Jakarta EE)的一部分提供了轻量级的Web服务解决方案。 在Tomcat 5.0.19中,我们关注的核心特性包括: 1. **Servlet 2.4支持**:这个版本的...

    Tomcat jakarta-tomcat-5.0.19.exe

    Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的...

    Apache+Tomcat5.0实现集群

    Apache和Tomcat是两个在Web服务领域广泛应用的开源软件。Apache作为HTTP服务器,负责处理静态内容,而Tomcat则是Java Servlet和JavaServer Pages(JSP)的容器,用于处理动态内容。通过集成Apache和Tomcat,可以构建...

    tomcat5.0.

    Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat ...

    mysql 5.0.19 绿色版

    Docs目录包含了MySQL的文档,帮助用户了解如何使用MySQL、管理数据库、解决问题等。这些文档通常以HTML或PDF格式提供,对于初学者和高级用户来说都十分宝贵。 data目录是存放数据库的实际数据文件的地方,包括表...

    官方原版源码 spring-framework-5.0.19.RELEASE.zip

    《Spring Framework 5.0.19.RELEASE 源码深度解析》 Spring Framework,作为Java领域最为广泛应用的开源框架之一,以其模块化、松耦合和强大的功能深受开发者喜爱。5.0.19.RELEASE是Spring Framework的一个稳定版本...

    tomcat+opemjms+mysql配置

    - **应用服务器**: Tomcat 5.0.19, OpenJMS #### 2. 软件支撑平台配置 - **操作系统**: Windows Server 2003 - **数据库**: MySQL 4.0 - **Java环境**: JDK 1.4.2 或以上版本 - **应用服务器**: Tomcat 5.0.19, ...

    官方原版完整包 spring-framework-5.0.19.RELEASE.zip

    《Spring Framework 5.0.19.RELEASE:官方原版完整解析》 Spring Framework,作为Java开发领域中最为广泛使用的应用框架之一,是构建高效、灵活且可测试的Java应用的重要工具。5.0.19.RELEASE是Spring Framework的...

    Thinkphp5.0.19宠物美容学院小程序下载地址.rar

    《Thinkphp5.0.19在宠物美容学院小程序开发中的应用详解》 Thinkphp5.0.19是一款基于PHP语言的轻量级框架,它以其强大的功能、高效的性能和简洁的代码结构,深受开发者喜爱。在这个压缩包中,我们提供的是一个专门...

    Thinkphp5.0.19宠物美容学院小程序完整前后台

    总结,这个Thinkphp5.0.19宠物美容学院小程序是一套全面的在线教育解决方案,适合宠物美容培训机构或个人教师使用,快速搭建自己的在线教育平台。其强大的功能、易用的后台管理系统以及与微信小程序的无缝对接,都使...

    tomcat5集群中的SESSON复制

    而集群部署则解决了这个问题,通过SESSION复制和失效无缝转移,实现了高可用性和数据持久性。 集群的基本概念是指一组协同工作的服务器,它们对外表现为单一服务,提供负载均衡、高可用性和容错能力。在Tomcat5中,...

    ThinkPHP5.0.19微信订餐点餐完整小程序独立商用版

    《ThinkPHP5.0.19微信订餐点餐完整小程序独立商用版》是一个基于ThinkPHP5.0.19框架开发的微信小程序项目,它提供了全面的餐饮订餐服务功能,适合商业运营。这个项目不仅可以帮助开发者了解和掌握ThinkPHP5.0版本的...

    Thinkphp5.0.19智能民族服饰小程序Thinkphp5.0.19智能民族服饰小程序.zip

    Thinkphp5.0.19内置了一些安全机制,如参数过滤、输入验证,但开发者还需编写安全的代码并定期更新框架以修复已知漏洞。 总的来说,这个项目结合了Thinkphp5.0.19的PHP后端开发能力与微信小程序的前端优势,旨在...

    Thinkphp5.0.19宠物美容学院小程序.zip

    《Thinkphp5.0.19宠物美容学院小程序:打造全方位的在线教育平台》 Thinkphp5.0.19是基于PHP语言的轻量级框架,专为开发高效、安全且易于维护的Web应用而设计。在这个版本中,Thinkphp优化了其核心功能,提升了性能...

    Thinkphp5.0.19手机壳手机配件商城小程序Thinkphp5.0.19手机壳手机配件商城小程序.zip

    《基于Thinkphp5.0.19的手机壳手机配件商城小程序开发详解》 本文将深入探讨使用Thinkphp5.0.19框架构建微信小程序的手机壳与手机配件在线商城的技术实现。Thinkphp5.0.19是Thinkphp框架的一个版本,它是一款广泛...

    ThinkPHP v5.0.19 核心版

    8. **错误和日志处理**:完善的错误处理和日志记录系统,有助于开发者及时定位并解决问题。 9. **性能优化**:如OpCache支持、路由缓存等特性,提升了框架的运行效率。 在提供的文件列表中,我们可以看到以下几个...

    tomcat 配置说明

    ### Tomcat配置说明 #### 一、环境搭建与配置 在进行Tomcat的配置之前,首先需要确保已经正确安装了Java Development Kit (JDK),因为Tomcat是基于Java的应用服务器,依赖于JDK来运行。 ##### JDK安装与配置 1. *...

    tpadminV1.3+thinkphp5.0.19.rar

    总的来说,"tpadminV1.3+thinkphp5.0.19"提供了一个强大且易于扩展的后台管理解决方案,尤其适合需要快速搭建后台的项目。通过深入理解和运用其中的技术,开发者不仅可以提升开发效率,还能更好地理解和掌握ThinkPHP...

Global site tag (gtag.js) - Google Analytics