GET方式提交在WEB中是非常常用的方式,有時候我們在使用GET方式提交請求不得不提交中文,但是TOMCAT等容器對于GET方式的編碼問題總是讓人折騰。
先說說流程吧:
我們的內容使用GET方式發送,就會在URL后面帶上內容,在游覽器發來的請求經過了游覽器的URI編碼,發送到服務器這邊,如果是struts2會經過攔截器進行URI解碼,并且使用"iso8859-1"進行編碼,因為傳輸過程是二進制的。
這時候想解決中文編碼問題有三種方式
假設:
url:http://localhost:8080/test?name=測試
一、在服務器進行處理
得到的內容是"iso8859-1",使用
String str = new String(name.getByte("iso8859-1"),"utf-8");
得到正確的值。
ps:這種方式有個缺點;這種方式服務器必須默認使用iso8859-1的方式編碼,如果我在TOMCAT更改默認的iso8859-1為utf-8,那么這種方式就無法生效了。
二、在TOMCAT配置文件中設置
在TOMCAT的目錄下conf/server.xml中,搜索"8080"端口,如果改了端口按端口號搜索,搜到之后在這個標簽中空格輸入 URIEncoding="UTF-8" ,它默認是iso8859-1。
ps:這種方式缺點顯而易見,換了服務器就要更改,有時候忘記也是很常見的事情。
三、手動編碼多一次
游覽器和服務器傳輸都是先編碼后解碼,對中文的支持不太好,那么能不能把中文事先轉換成英文或數字傳輸呢?
假設:
1、name=測試,在JS標簽中,使用encodeURI(param)方法先將“測試” 轉成 name=%26%92(瞎編的) 游覽器再自動進行URI編碼 name=%2525%2592(%的URI編碼為%25);
ognl表達式中,使用<s:param name="name" value="%{@java.net.URLEncoder.encode(name,'utf-8')}"> 對值進行URI編碼,同時在struts2配置文件中開啟靜態方法的支持 java.net.URLEncoder.encode()。
struts.xml: name="struts.ognl.allowStaticMehtodaccess" value="true"
2、這時候將這鏈接GET方式提交了
3、服務器那邊得到 name=%26%92 ,我們再使用URIDecoder.decode(name,"utf-8"); 進行解碼,這樣就得到了“測試”
PS:這種方式是不是比較好,不依賴TOMCAT
新聞熱點
疑難解答