原文連結:https://blog.csdn.net/mm_hello11/article/details/84261672
https://blog.csdn.net/mm_hello11/article/details/84261672
報錯解釋:
HTTP GET請求透過查詢字串(即URL中"?"後面的部分)傳遞引數。如果查詢字串包含非法字元,伺服器可能會拒絕請求並返回錯誤,因為這些非法字元可能會破壞URL的格式或者伺服器的安全性。
非法字元通常指的是除字母、數字和某些預定義的字元(如-._~!$&'()*+,;=)以外的所有字元。
HTTP標準的兩種請求方式:Post和Get,關於這兩種請求方式的區別相關資料雲集,這裡不做闡述。然而,你是否注意到:
我們透過get方式從瀏覽器的位址列傳遞資料給伺服器,當引數的值中含有某些特殊跳脫字元的時候,沒經過些許處理將得不到預期的結果。
當我們的請求的url為:
http: // localhost:8080/index.jsp?parameter=kalman03#kalman#1
或許你預期在伺服器端獲得的parameter的結果為kalman03#kalman#1,錯!!!實際上得到parameter的值為kalman03。
這究竟是為什麼呢?
原因:
parameter的值含有特殊字元#,瀏覽器自動截斷#字元和其後面的值,這樣得到的值就為kalman03。
推廣:
當引數值中含有特殊字元 ?!=()#%& 的時候,獲得的值同樣也會出現與預期結果不一致的情況。
解決方案:
方法1:透過post方式傳遞資料;
方法2:對引數進行一次編碼parameter=escape(parameter);
第一種解決方案不解釋也能明白,現在解釋下第二種方法的處理:
JavaScript escape() 函式的功能是把其中某些字元替換成了十六進位制的轉義序列。該方法不會對ASCII 字母和數字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。其他所有的字元都會被轉義序列替換
在get請求引數中如果包含&符號,在傳送請求時就會被當作引數的分割符處理
比如請求引數:
var url= "xxxx?name=" + "aaa&bbb"
期望的請求引數應該是name = aaa&bbb
實際的請求引數會變成 name = aaa 和 bbb=
處理方法
在拼接引數的時候,使用 encodeURIComponent() 進行手動轉義。
var url= "xxxx?name=" + encodeURIComponent("aaa&bbb")
特殊特殊字元的含義
字元 特殊字元的含義 URL編碼
+ URL 中+號表示空格 %2B
空格 URL中的空格可以用+號或者編碼 %20
/ 分隔目錄和子目錄 %2F
? 分隔實際的 URL 和引數 %3F
% 指定特殊字元 %25
# 表示書籤 %23
& URL 中指定的引數間的分隔符 %26
= URL 中指定引數的值 %3D
示例程式碼:
//處理特殊字元get請求識別錯誤的情況 //filename為帶有特殊字元的url字串 var curFilename = null; //含有特殊字元的話,處理完再賦值(沒有處理空字串) if(filename.indexOf('#') != -1 || filename.indexOf('+') != -1 || filename.indexOf('/') != -1 || filename.indexOf('?') != -1 || filename.indexOf('%') != -1 || filename.indexOf('&') != -1 || filename.indexOf('=') != -1){ curFilename = filename.replace(/([\#|\+|\/|\?|\%|\#|\&|\=])/g, function ($1) { return encodeURIComponent($1) }) }else{ //如果不含有特殊字元直接賦值 curFilename = filename; } //傳送請求(我這裡是我專案中封裝的,大家正常傳送請求就可以) Cm.get(Cm.webroot + curFilename, function (msg) { },function (msg) { })