亂碼問題
原因:
tomcat默認的在url傳輸時是用iso8859-1編碼。
解決方案一:
在使用get傳輸參數時,將參數中的中文轉換成url格式,也就是使用urlEncode和urlDecode來傳輸,使用這種方式就是把中文轉換成以%開頭的編碼在url中傳輸。
使用這種方法時,要注意兩點。
1.前台使用urlencode,在后台相應的使用urldecode。
2.使用urlencode的內容是參數內空。千萬要注意,他是會把等於號等符號也給轉換了。所以,最好是先把參數傳換后再進行拼接。而不是把url拼接好再去轉換。
解決方案二:
配置tomcat,使用其在url傳輸過程中使用相應的支持中文的編碼。一般國內的喜歡用gbk或gb2312。我個人建議使用utf-8
在tomcat的/conf/server.xml文件中,找到以下這一行。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
這行的意思也就是使用8080端口來接收html的請求。在這里可以加幾個參數來配置不同的效果。
URIEncoding="UTF-8" 設置url傳輸時對url內容的編碼格式
compression="on" 打開壓縮功能
compressionMinSize="2048" 啟用壓縮的輸出內容大小,這里面默認為2KB
noCompressionUserAgents="gozilla, traviata" 對於以下的瀏覽器,不啟用壓縮
compressableMimeType="text/html,text/xml" 壓縮類型
對於要解決亂碼來說,改成以下就行
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
轉:
經過分析,使我對TOMCAT的處理機制和HttpServletRequest有了更加深入的認識。
1.filter過濾器中獲取參數值出現亂碼
下面是服務器端中的過濾器獲取參數的代碼:
- public void doFilter(ServletRequest arg0, ServletResponse arg1,
- FilterChain arg2) throws IOException, ServletException {
- String foo=arg0.getParameter("foo");
- System.out.println(foo);
- arg2.doFilter(arg0, arg1);
- }
當我在瀏覽器輸入“http//:localhost:8080/rest/test?foo=中國”時,瀏覽器會自動對"中國"進行URI轉碼,由於使 用的中文語言環境,瀏覽器會將“中國”轉碼為"%D6%D0%B9%FA"."D6D0","B9FA"分別"中","國"的GBK編碼。等價於在 JAVA語言中作了如下操作
- URLEncoder.encode("中國","GBK")
傳遞到服務器后的URL實際為“http//:localhost:8080/rest/test?foo=%D6%D0%B9%FA”。
由於TOMCAT默認會對URL進行解碼,並且使用的是ISO-8859-1字符集,如下所示
- URLDecoder.decode("%D6%D0%B9%FA","ISO-8859-1");
因為編碼和解碼使用的是不同的字符集,所以解碼出來的字符串肯定是不對的,故而使用如下方式獲取參數值時出現亂碼。
- String foo=request.getParameter("foo");
2.resteasy的service方法中獲取參數出現亂碼
- @GET
- @Path("/test")
- public void hello10(@QueryParam(value="foo") String foo) {
- System.out.println(foo);
- }
resteasy中獲取到request參數foo的機制與前面的filter略有不同。foo參數的是值由resteasy框架進行類似如下處理后獲得的。
- String params=request.getQueryString();
- System.out.println(params);//foo=%D6%D0%B9%FA
- String encodedParams= URLDecoder.decode(params,"UTF-8");
- ......
通過getQueryString()方式獲得的參數並沒有被TOMCAT解碼過,但被resteasy框架進行了解碼,當傳入參數不是以UTF-8編碼的話獲取到的參數就可能是亂碼
3.總結
使用request.getParameter方式獲得的參數是已經經過web服務器解碼的
使用request.getQueryString可以獲得未解碼的原始參數
對於tomcat解碼造成的亂碼問題可以通過2種途徑解決
修改tomcat配置文件設置解碼方式
服務器端對於獲取到的參數進行new String(param.getBytes("ISO-8859-1"),"頁面指定編碼")轉換