tomcat5中,為了保證get資料采用UTF8編碼,在server.xml中進行了如下設定:
<Connector port="8080" maxThreads="150" minSpareThreads="25"
maxSpareThreads="75" enableLookups="false" redirectPort="8443"
acceptCount="100" debug="99" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="UTF-8"/>
這裡指定了get時候的資料編碼。但是,當使用IIS作為webserver轉發servlet/jsp請求給Tomcat時候,這個設定卻失效了。其實原因很簡單:IIS是通過AJP協定,把請求轉發到Tomcat監聽的8009端口上的,是以這裡針對8080的設定自然就無效了。正确的方法是進行下面的設定:
<Connector port="8009" enableLookups="false" redirectPort="8443"
debug="0" protocol="AJP/1.3" URIEncoding="UTF-8"/>
========================================================================================
Tomcat 6.0
路徑:Tomcat 6.0\conf\server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />
問題解決辦法:
1)修改server.xml,在connector标簽中增加URIEncoding="gb2312"
2)對url編碼
java.net.URLEncoder.encode( url );
注意:url的起始如果非中文如 "/test/中文/中國.jsp"
則應該寫成"/test/" + java.net.URLEncoder.encode( "中文/中國.jsp" );
意思是隻對中文編碼,但是 "中文/中國.jsp"中的"/"沒有問題
tomcat設定URIEncoding="utf-8"之後,可以解決了中文路徑問題,例如:http://localhost:8081/測試.jpg
但是http://localhost:8081/TServlet?a=測試
這樣擷取不到中文,也不能正确編碼,因為tomcat使用的是預設的ISO-8859-1編碼,在變成UTF-8之前已經編碼過了,是以亂碼,要讓不進行ISO-8859-1編碼,還得加一句:useBodyEncodingForURI="true"
tomcat不設定,用預設的
你在你的servlet或者struts的action中,對request對象設定編碼即可解決問題。
例:request.setCharacterEncoding("GBK");
常用的方法是建一個過濾器filter,把request.setCharacterEncoding("GBK"); 放到過濾器的方法裡,這樣每次送出都會經過過濾器設定編碼,就不需要每個servlet或者action中都寫一次這個代碼了
作者:進階測試開發網
本文版權歸作者有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。