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時,經過轉義的參數也更安全,在接收的時候,再進行解轉義的操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章