1. 程式人生 > >IE相容 請求引數中文亂碼或請求無效 轉義與轉碼

IE相容 請求引數中文亂碼或請求無效 轉義與轉碼

要解決傳送請求包含中文引數,且還要相容IE瀏覽器,需要針對不同場景採用對應的方法來處理

概括為以下2種場景:

應用場景一:a標籤href請求

<%
	String str1 = "引數1"; //中文
	String str2 = "引數2"; //中文
%>
<a href="YourController/function1?param1="+str1+"¶m2="+str2 >點我跳轉到Controller的function1方法 </a>
<a href="YourPage/page1.jsp?param1="+str1+"¶m2="+str2 >點我跳轉到YourPage目錄下的page1.jsp頁面</a>
以上情況,在谷歌瀏覽器下,如果不對編碼進行任何處理,中文是可行的,但是!在IE瀏覽器下,是絕對行不通的。
對應的解決辦法則是:轉義
這裡簡述轉義的概念:
web 開發中通過問號(?)方式在瀏覽器位址列中傳值時。瀏覽器是通過“&”來區分問號後的引數個數的。 如果出現傳值引數中帶有“&”時,在接受頁面就會出現錯誤,類似如下請求路徑:/next.jsp?param1=hendhs89&furej & param2=sss
引數param1中含有轉義字元“&” ,這樣會導致被請求頁的引數接收錯誤。
在傳值前 通過 java.net.URLEncoder.encode(param1) 編碼處理後,可將轉義字元轉為16進位制;
1. + URL 中+號表示空格 %2B
2. 空格 URL中的空格可以用+號或者編碼 %20
3. / 分隔目錄和子目錄 %2F
4. ? 分隔實際的 URL 和引數 %3F
5. % 指定特殊字元 %25
6. # 表示書籤 %23
7. & URL中指定的引數間的分隔符%26
8. = URL中指定引數的值 %3D
9. ! URL中指定引數的值 %21
上面提到的 java.net.URLEncoder.encode(param1) 方法,是jsp頁面轉義的,當然我更提倡使用javascript的轉義方法:encodeURI()
傳送示例:
<%
	String str1 = "引數1"; //中文
	String str2 = "引數2"; //中文
%>
<a href="YourController/function1?param1="+encodeURI("<%=str1%>")+"¶m2="+encodeURI("<%=str2%>") >點我跳轉到Controller的function1方法 </a>
<a href="YourPage/page1.jsp?param1="+encodeURI("<%=str1%>")+"¶m2="+encodeURI("<%=str2%>") >點我跳轉到YourPage目錄下的page1.jsp頁面</a>
接收示例(從URL中取,而不是從parameter裡取!):
<%
	String query = request.getQueryString();
	String str1 = query.split("&")[0].split("=")[1];
	String str2 = query.split("&")[1].split("=")[1];
 	String str1 = java.net.URLDecoder.decode(str1,"utf-8");
 	String str2 = java.net.URLDecoder.decode(str2,"utf-8");
%>

應用場景二:ajax的get請求

ajax的get請求則是從parameter裡取出得到,亂碼原因則是因為前端傳送與後端接收的編碼不同導致
對應的解決辦法則是:轉碼(轉編碼)
編碼含義就不仔細介紹了,常用的UTF-8編碼:
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼,又稱萬國碼。由Ken Thompson於1992年建立。現在已經標準化為RFC 3629。UTF-8用1到4個位元組編碼Unicode字元。用在網頁上可以統一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。
含中文頁面通常使用的是UTF-8編碼,用URL傳遞到後臺則需要ISO8859-1轉UTF-8,瀏覽器get請求帶參造成的。
前端頁面:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<a href="YourController/function?str3=中文"></a>
後臺方法:
String str3 = request.getParameter("str3");
str3 = new String(str3.getBytes("ISO-8859-1"),"UTF-8");
處理後的str3則是正確的中文。

總結:在解決帶參跳轉問題時,如果是ajax,能使用post的儘量不使用get,post是將引數存在訊息主體裡的,並且是經過編碼的,伺服器通常是根據請求頭headers中的Content-Type欄位來獲知請求中的訊息主體是何種編碼,再對主體進行解析,則不用再處理。若不得不用get請求,如a標籤,或ajax的get請求,則儘量使用轉義,在暴露帶參的url時,經過轉義的引數也更安全,在接收的時候,再進行解轉義的操作。