背景:
URL傳參在web開發中很常見,一般來說這種方式並不推薦,原因就是瀏覽器多種多樣,各家瀏覽器對URL地址的解析的表現很不一樣,特別是當參數有非ASCII字符、英文字母、阿拉伯數字時。
在CRM系統中,有一個”DFKbtn”的按鈕,它的作用是將用戶在CRM界面填寫的一些參數傳遞到DFK的頁面中去。這個按鈕的方法是這樣的:
/***********分割線***********/
window.open(url + "aam/acv/asd/login.do?
name=@[用戶名]&&Customer=@[客戶名]&&customerId=@[客戶ID]");
/***********分割線***********/
其中的用戶名,客戶名,客戶ID都是跟在url地址后面的參數。客戶名對應DFK的客戶名稱。其中客戶名這個參數的值就有可能出現一些特殊符號,比如鍵盤上的”+”,”@”,”#”,空格等等。
實際使用的時候發現,出現這些特殊符號的時候,傳遞到DFK的客戶名稱會出現錯漏,比如,如果客戶名含有空格,客戶名=”2.4寸 項目”,DFK頁面接收到的客戶名稱就是” 2.4 ”,空格后面的值都沒有。如果客戶名=” 2.4寸項目+TPLC”,那么客戶名稱=” 2.4寸項目”,加號后面的值都沒有。如果客戶名=” 2.4寸項目# TPLC”,那么點擊”DFKbtn”按鈕就會直接報錯,顯示服務器異常。除上述符號外,!@#$%^&*””等符號都不能正常傳遞。
原因:
url需遵守http/https協議,http協議中保留了一些符號作為特殊用途,比如”+”是作為連接符,”&”是作為參數連接符,,”/”作為路徑分隔符,空格作為保留字符。如果url地址本身或者是url攜帶的參數中含有這些特殊符號,那么url在使用時就需要根據不同的情況來進行地址解析,具體行為表現可以參考http://blog.csdn.net/scyatcs/article/details/26766437 這里就不再贅述。由於網絡編程中url解析跟網站頁面字符集、網站服務器編碼字符集、瀏覽器默認字符集都有關系,因此為了最大限度的保留我們輸入的值,需要對傳遞的參數進行編碼,防止瀏覽器對參數進行篡改,變成亂碼。
最方便的方式是在頁面javascript中使用URL編碼函數,類似這樣:
/***********分割線***********/
window.open(url + “aam/acv/asd/login.do?
name=@[用戶名]&&Customer=”
+encodeURIComponent(@[客戶名])
+”&&customerId=@[客戶ID]"
);
/***********分割線***********/
其中藍色部分就是URL編碼函數中的一種。選擇該函數是因為它編碼的字符最多,大部分符號都可以被編碼。
這樣編碼以后,用戶填寫的項目名是什么,報DFK得到的客戶名稱就是什么。比如客戶名=” 2.4寸 項目# TPLC+SAC”,客戶名稱=” 2.4寸 項目# TPLC+SAC”。
需要注意的是,有兩個符號是一定不要出現在url參數或者URL地址中的,一個是””雙引號,一個是”\”反斜杠.在編程中,雙引號表示取雙引號之間的值,在url地址中的雙引號會造成地址解析在不恰當的地方斷開,所以不能成功解析地址。反斜杠在編程中一個作用是路徑分隔符,另一個作用是轉義字符,用作轉義字符時表示跟在反斜杠后面的字符將不會被轉義。比如,項目名=” 2.4寸\項目”,那么客戶項目名稱=”2.4寸項目”,注意其中的反斜杠並不會被顯示。
解決辦法:
如上所述,將url地址中的參數用encodeURIComponent進行編碼,在不包含雙引號和反斜杠的情況下,將會傳遞正確的值,而接收方不需要做任何改動。
