標籤:javascript ajax url 字元轉義 半形
某些項目是用get的方法來提交Ajax,後台再對get的方法的值傳遞過來的值進行解碼。比如在提交ajax的url寫上/xx?param1=xx¶m=2...
這樣很不好,一般,都是使用post方法來提交的。post方法提交Ajax在《【Servlet】在Servlet3.0中利用json+ajax把資料庫查詢出來的資料推向前台顯示,無額外的json解析包》(點擊開啟連結)與《【Struts2】利用JQuery實現Struts2的Ajax功能》(點擊開啟連結)已經提到過,這裡不再贅述,但是,面對項目中一大堆前任留下來的也好,或者自己就喜愛的get方式ajax,你就應該對傳遞過去的參數進行處理。否則,如果使用者在輸入框寫入~`[email protected]#$%^&*()_+-={}|[]\:"<>?;‘,./等這些奇奇怪怪的英文符號,就有可能截斷提交的url,讓你的web工程崩潰。
你在擷取使用者在表單填寫的東西之後,就應該處理好~`[email protected]#$%^&*()_+-={}|[]\:"<>?;‘,./這些奇奇怪怪的英文符號。字元轉義是網頁開發的一個很嚴重的問題。以前的輸入框少,這個問題還不嚴重,現在輸入框的,使用者在網路上面互動多,這個問題就變得越來越嚴峻。
你還不能像《【JavaScript】某些字元不轉義可以導致網頁崩潰與涉及逸出字元的顯示方法》(點擊開啟連結)所給的方法一樣,把~`[email protected]#$%^&*()_+-={}|[]\:"<>?;‘,./這些奇奇怪怪的英文符號寫成& amp; & lt;等逸出字元,這樣,&就更多了,提交的url還是截斷了。所以一般就不應該用get的方法提交Ajax的,但是,你可以考慮把這些符號都改成全形。
下面給出僅符號不包括英文,半形轉全形的方法:
/* * escapeAjaxString()是在以get方法的ajax提交之前,對被提交的文本作調用 * 防止[email protected]#$%^&*()等符號使得get方法的ajax地址斷裂 */function escapeAjaxString(txtstring) {var tmp = "";for (var i = 0; i < txtstring.length; i++) {if (txtstring.charCodeAt(i) == 32) {tmp = tmp + String.fromCharCode(12288);}if ((32 < txtstring.charCodeAt(i) && txtstring.charCodeAt(i) < 48)|| (57 < txtstring.charCodeAt(i) && txtstring.charCodeAt(i) < 65)|| (90 < txtstring.charCodeAt(i) && txtstring.charCodeAt(i) < 97)|| (122 < txtstring.charCodeAt(i) && txtstring.charCodeAt(i) < 127)) {tmp = tmp + String.fromCharCode(txtstring.charCodeAt(i) + 65248);} else {tmp = tmp + String.fromCharCode(txtstring.charCodeAt(i));}}return tmp;}
注意到第二個判斷,裡面的條件非常多,但也只是一個範圍。因為在Ascii碼錶、Unicode碼錶中,符號的分布是斷裂在不同的區間的。
這裡插一句:Unicode碼錶包含Ascii碼錶,Ascii碼錶是Unicode碼錶的子集,Unicode碼錶的0-255就是Ascii碼錶全部,Ascii碼錶的0-255,順序還是一樣的。
上面演算法對傳遞過來的字串進行檢驗:
如果遇到空格,則將其位移12288位置,變成中文的空格。
如果遇到半形符號,則將其位移65248個位置,將其變成全形的符號。
如果遇到其它東西,則不位移。
然後重新構造一個新的字串,返回。
這就完成了半形符號、空格向全形的轉化。Get方法處理Ajax的時候,就會當做一個普通的中文文書處理,不會因為出現~`[email protected]#$%^&*()_+-={}|[]\:"<>?;‘,./這些奇奇怪怪的英文符號截斷提交的ActionURL的情況!
【JavaScript】使用get方法提交Ajax之前對於某些符號的處理方案