實際運用 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 這個 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;
}
請特別注意紅色區塊,當 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>
文章来至:http://www.javaworld.com.tw/jute/post/view?bid=9&id=44042&sty=1&tpg=1&age=0
分享到:
相关推荐
Apache Tomcat 8.0.33 是一个广泛使用的开源软件,主要作为Java Servlet和JavaServer Pages(JSP)的容器。它实现了Java EE(现在称为Jakarta EE)Web应用程序的轻量级部分,特别是Servlet和JSP规范。在本描述中,...
<Connector URIEncoding="utf-8" .../> 这将设置 Tomcat 的字符集为 UTF-8,以支持中文字符。 启动和关闭 Tomcat 在设置了环境变量和内存参数之后,我们可以启动 Tomcat 服务器。可以在命令行中输入以下命令: ...
redirectPort="8443" URIEncoding="UTF-8"/> ``` 3. 配置 MySQL 数据库 my.cnf 在 MySQL 数据库的配置文件 my.cnf 中,需要将默认字符集设置为 UTF-8。这样可以确保 MySQL 数据库的字符编码是一致的。 ```bash ...
在 Tomcat 5.0 目录下的 conf-->server.xml 添加代码 URIEncoding="GBK",以便指定 Tomcat 5.0 的编码格式为 GBK。这将确保 Tomcat 5.0 正确地处理中文字符。 Step 3: 指定 Tomcat 5.0 的 JDK 环境 在 Eclipse 中...
- 在Tomcat的`conf/server.xml`文件中找到`Connector`元素,添加`URIEncoding="UTF-8"`属性来指定URL的编码方式。 ```xml connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> ``` - 在`...
- `<Connector port="9050" protocol="HTTP/1.1" redirectPort="9543" URIEncoding="gbk"/>`:这里的`port`属性指定了Tomcat的HTTP监听端口,`redirectPort`属性则指定了HTTPS重定向端口,`URIEncoding`属性指定了...
connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> 修改目的:为了解决使用HTTP Get方法传递中文参数乱码的问题 修改context.xml: 把修改成<Context reloadable="true"> 修改目的:当Web...
### Tomcat 启动参数设置详解 #### 一、背景介绍 在部署Java Web应用程序时,经常使用Apache Tomcat作为应用服务器。然而,在高并发或大数据量处理的应用场景下,Tomcat可能会出现内存溢出等问题。为了提升Tomcat的...
### Tomcat的详细配置信息 #### 一、Tomcat简介 Tomcat是一个开源的Web应用服务器,由Apache软件基金会的Jakarta项目维护。Tomcat因其技术先进、性能稳定且免费的特点,深受Java开发者喜爱,并被广泛应用于中小型...
一般我们所装的linux服务器,是中文版的,所以系统环境的编码是gbk,然而我们项目的编码是UTF-8,这就必须在tomcat的server.xml文件中修改,在两个地方添加 URIEncoding="UTF-8",具体代码如下:
修改的方式是在Tomcat的`Server.xml`配置文件中的`<Connector>`元素下添加或修改`URIEncoding`属性。 ##### 步骤一:定位`Server.xml` 首先,需要找到Tomcat安装目录下的`conf`目录,其中包含了`Server.xml`配置...
`URIEncoding`参数是Tomcat连接器(Connector)配置中的一个重要元素,用于指定请求URI的字符编码。默认情况下,Tomcat不处理请求URI的编码,这可能导致非ASCII字符在URL中传输时出现乱码。将`URIEncoding`设置为`...
在此示例中,`URIEncoding="GBK"`被添加到了`Connector`元素的末尾,这样Tomcat就能够识别并正确处理包含GBK编码的中文URL了。 #### 三、配置新的Web应用程序 要在Tomcat中部署一个新的Web应用程序,需要在`server...
要让Tomcat默认支持GBK编码,可以在`server.xml`配置文件中的`Connector`元素内设置`URIEncoding`属性,例如: ```xml <Connector URIEncoding="GBK" ... /> ``` 这将使Tomcat在解析URL参数时使用GBK编码。 2....
我们可以在该元素中设置 URIEncoding 属性,以指定 Tomcat 的字符编码。例如: ```xml <Connector URIEncoding="UTF-8" /> ``` 这样,我们就可以将 Tomcat 的字符编码设置为 UTF-8。 二、过滤器中的字符编码设置 ...
2. **URIEncoding**:设置为`UTF-8`,确保正确处理非ASCII字符的URL。 3. **enableLookups**:设为`false`,禁用DNS查找,以提高性能。 4. **disableUploadTimeout**:设为`true`,防止上传超时导致的错误。 5. *...
### 同时配置多个Tomcat服务器 在现代的软件开发环境中,经常会出现需要在同一台机器上同时运行多个Tomcat服务器的情况。例如,在进行测试、开发或部署不同版本的应用程序时,这种需求尤为常见。本文将详细介绍如何...
- **禁用DNS查找**:通过设置`URIEncoding="UTF-8"`和`useAddr="false"`来禁用DNS查找,避免不必要的延迟。 - **优化JVM参数**:根据应用的实际内存使用情况调整JVM的堆大小和其他相关参数,如-Xms、-Xmx、-XX:...
在IT行业中,Tomcat6是一款广泛应用的开源Java Servlet容器,由Apache软件基金会的Tomcat项目维护。本篇文章将深入探讨如何针对Tomcat6进行内存管理、用户管理和编码配置,以优化其性能和安全性。 首先,我们关注的...