URL地址傳參中特殊符號的轉碼和解碼


背景:

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進行編碼,在不包含雙引號和反斜杠的情況下,將會傳遞正確的值,而接收方不需要做任何改動。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM