我們請求的中文參數會被URL轉碼為有%xy類型,服務器接收到這些字節數組時,遍歷數組,找到name和value的字節段,解碼 name和value的值並添加到map集合中,其實這就是request.getparameter的實現原理。。。不清楚的地方,在解碼過程中,服務器得到的 字節數組中 帶有%的字節,是怎麼處理的。源碼中,通過urldecode解碼的這些字節,但是這個是是它自定義的,並不是URLDecode.decode
就是這裡不清楚,什麼時候去掉的%的字節的。
request這裡其實在取之前,程序內l默認會自動按iso-885以9-1來解碼,由於它是單字節編碼,而漢字是雙字節,所以會出現亂碼。所以這時有request取得
參數之前,先設置解碼的格式。才不會亂碼。等你取得時候才會解碼的。才去掉%
解析請求的URL是在org.apache.coyote.HTTP11.InternalInputBuffer的pareRequestLine方法中進行的,這個方法把傳過來的byte[]設置到org.apache.coyote.Request
的相應屬性。注意,這裡存儲的URL依然是byte格式(也就是加%),真正轉換成char是發生在org.apache.catalina.connector.CoyoteAdapter的convertURI
方法中完成的。所以,有中文編碼時,最好將URIEncoding設置成UTF-8編碼。解碼是getparameter被第一次調用時發生的。它會調用
org.apache.catalina.connector.Request中的paseParameters方法,這個方法將會對GET或POST的數據進行解碼。(純手打,累死了。。。。。)