維護一個古董級的項目,在jsp傳參的時候亂碼了,如下:
<jsp:forward page="/pub/msgpage/MsgTo.jsp">
<jsp:param name="msg_Title" value='<%=Form.getFES("回復成功")%>'/>
<jsp:param name="msg_Content" value='<%=Form.getFES("回復成功,正在操作")%>'/>
<jsp:param name="url_to" value='<%=addpic_url%>'/>
</jsp:forward>
使用request得到的都是問號,最后在網上找到了下面的一段話,才解開了我心中的謎團。
最近在做GGLook的時候,發現<jsp:forword>被tomcat generate成了...pageContent.forword(...java.util.URLEncoder.encode("" + ... )); 看了函數原形java.util.URLEncoder.encode有兩種形式:1.encode(String s) 2.encode(String s, String enc).對于第二個,我們可以對編碼進行設置.但是對于第一個,j2sdk實現的默認編碼卻是iso-8859-1.沒搞懂為什么內部編碼為UNICODE的java要把他實現成為iso-8859-1.還有就是tomcat為什么不采用配置文件的方式使我們自己能設定其編碼方式.現在一跳轉到errorpage.jsp就是亂碼.沒辦法,要嗎改j2sdk,要嗎改tomcat.最后,確定下載tomcat原代碼包,將Generator.java改掉,重新編譯,現在一切運行正常! |
原來是因為url里面沒有指定編碼,會默認使用ISO-8859-1進行編碼,而ISO-8859-1是不支持中文的,即URLEncoder.encode之后 都會顯示
%3F%3F%3F,所以之后無論使用何種字符集解碼都是問號了。。。
最后的解決方案有一下幾種,其中第四種沒有成功:
- 寫個filter,然后在filter里面進行request.setCharacterEncoding("GBK")
- 每個jsp頁面的頭部都寫上request.setCharacterEncoding("GBK"),原理和1是一樣的
- 傳參數前先對中文進行encode,得到參數后再使用對應的decode,這樣的話傳遞的參數就不會丟失,但是比較麻煩
- 修改tomcat的server.xml配置文件,在<Connector>節點增加一個屬性:URIEncoding="GBK",但是感覺這個參數沒有起作用,官方文檔是這么描述的“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. ”
我的理解是要區分你是怎么提交數據的,如果是Post的話,則會使用過濾器;如果是Get方式的話,tomcat默認會使用URIEncoding----是tomcat的server.xml配置文件,在<Connector>節點有一個URIEncoding的屬性,如果不配置的話默認是:URIEncoding="ISO-8859-1",官方文檔是這么描述的“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. ”
因為ajaxAnywhere.getAJAX是通過Get提交數據的(sends a GET request to the server.),所以還是使用了ISO-8859-1編碼。
HTTP 定義了與服務器交互的不同方法,最基本的方法是 GET 和 POST。事實上 GET 適用于多數請求,而保留 POST 僅用于更新站點。根據 HTTP 規范,GET 用于信息獲取,而且應該是 安全的和 冪等的。所謂安全的意味著該操作用于獲取信息而非修改信息。換句話說,GET 請求一般不應產生副作用。冪等的意味著對同一 URL 的多個請求應該返回同樣的結果。完整的定義并不像看起來那樣嚴格。從根本上講,其目標是當用戶打開一個鏈接時,她可以確信從自身的角度來看沒有改變資源。比如,新聞站點的頭版不斷更新。雖然第二次請求會返回不同的一批新聞,該操作仍然被認為是安全的和冪等的,因為它總是返回當前的新聞。反之亦然。POST 請求就不那么輕松了。POST 表示可能改變服務器上的資源的請求。仍然以新聞站點為例,讀者對文章的注解應該通過 POST 請求實現,因為在注解提交之后站點已經不同了(比方說文章下面出現一條注解);
在FORM提交的時候,如果不指定Method,則默認為GET請求,Form中提交的數據將會附加在url之后,以?分開與url分開。字母數字字符原樣發送,但空格轉換為“+“號,其它符號轉換為%XX,其中XX為該符號以16進制表示的ASCII(或ISO Latin-1)值。GET請求請提交的數據放置在HTTP請求協議頭中,而POST提交的數據則放在實體數據中;
GET方式提交的數據最多只能有1024字節,而POST則沒有此限制。
posted on 2008-09-20 17:03
歲月如歌 閱讀(2347)
評論(1) 編輯 收藏 所屬分類:
java