AJAX POST數(shù)據(jù)中有特殊符號(轉(zhuǎn)義字符)導(dǎo)致數(shù)據(jù)丟失的解決方法
使用Ajax傳送數(shù)據(jù)時,當數(shù)據(jù)中存在加號(+)、連接符(&)或者百分號(%)時,服務(wù)器端接收數(shù)據(jù)時會丟失數(shù)據(jù)。分析Ajax傳送數(shù)據(jù)的格式與Javascript的語法:
1. "+"號:JavaScript解析為字符串連接符,所以服務(wù)器端接收數(shù)據(jù)時"+"會丟失變空格。
2. "&"號:JavaScript解析為變量連接符,所以服務(wù)器端接收數(shù)據(jù)時&符號以后的數(shù)據(jù)都會丟失變空格。
解決方法是通過正則表達式進行編碼替換(假設(shè)postStr是你想通過ajax傳送的數(shù)據(jù)字符串)
postStr = postStr.replace(/%/g, "%25"); postStr = postStr.replace(/\&/g, "%26"); postStr = postStr.replace(/\+/g, "%2B");
下面是其它網(wǎng)友的補充
今天用ckEditor4編輯器時,把編輯器里面的內(nèi)容通過Ajax傳到后端的時候,居然發(fā)現(xiàn)后端接收的數(shù)據(jù)不完整,以下我編輯器內(nèi)容的源碼:
<p> <img src="https://dss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1483731740,4186543320&fm=26&gp=0.jpg"/> </p>
結(jié)果“4186543320”后面的內(nèi)容就一直沒有收到。
原因:
通過網(wǎng)絡(luò)查資料,得到的原因是分號”;”導(dǎo)致的問題。
ajax傳輸以“;”分割的字符串,卻發(fā)現(xiàn)后臺只會接受到第一個字符串。
例如:我向后臺傳輸
“小明;小紅;小白”
后臺只會接收到小明。
經(jīng)過我的親自測試,發(fā)現(xiàn):
1、Ajax傳的字符串數(shù)據(jù),javascript用console.log可以完整的輸出來,只是后端接收不全,例如:
2、Ajax傳的字符串數(shù)據(jù),我直接傳分號”;”+其它正常數(shù)據(jù),后臺一樣是可以接收到的,一點問題都沒有。
根本原因是:
ajax請求內(nèi)容中包含一些HTML轉(zhuǎn)義字符,例如:
> < & "
最主要的是這些轉(zhuǎn)義字符中含有&。
例如:
如果我發(fā)送“ blablabla&ltgrogrogro”,則服務(wù)器僅收到“ blablabla”。
&在URL參數(shù)中是什么意思?
我相信做過web程序開發(fā)的人都知道:&代表數(shù)據(jù)查詢字符串中的另一個變量,&以此格式表示新參數(shù)的開始。
最后去看了一下“ckEditor4編輯器”,無論是為空字符串還是回車,都會自動的幫你進行HTML轉(zhuǎn)義,哪怕你配置了“不轉(zhuǎn)義HTML”參數(shù),也會自動幫你轉(zhuǎn)。
解決方法
知道了上面的原因,解決方法就容易大了,有程序經(jīng)驗的人已經(jīng)知道怎么做了?
原理就是:把HTML轉(zhuǎn)義字符解碼成標簽或者編碼再傳送數(shù)據(jù)。
以我這里用“ckEditor4編輯器”為例子,只需要修改config.js,增加如下配置參數(shù):
config.basicEntities = false; config.htmlEncodeOutput = false;
以上這種也有一個弊端,如果你的編輯器里面有“代碼塊“功能,要插入一些代碼,例如:PHP、java、python、c++.......等等。代碼塊這里同樣也會自動進行HTML字符轉(zhuǎn)義。
最終的解決方法:
1、ajax請求傳字符串數(shù)據(jù)的時候,我們先做JavaScript URL編碼,例如:
var contents = encodeURIComponent(document.getElementById( 'editor1' ).value);
編碼函數(shù):encodeURIComponent()
解碼函數(shù):decodeURIComponent()
注意:用此編碼函數(shù),Asp與PHP處理后端的時候不需要解碼,會自動的相互通訊,自動解碼。
或
編碼:encodeURI()
解碼:decodeURI()
注意:用此編碼函數(shù),后端處理必須先解碼。
2、后端接收數(shù)據(jù)的時候,我們要做一個URL解碼,以PHP為例子,例如:
$contents = htmlentities(urldecode($_POST['contents']),ENT_QUOTES);
urldecode() — 解碼
urlencode() — 編碼
注意:為了安全起見,不管前端用哪個函數(shù)?只要是URL編碼過的,后端都需要解碼,好兼容。
其它解決方法:
Ajax請求傳數(shù)據(jù)類型,可以改為:json、text。具體請參考:HTTP Content-type 類型
總結(jié):
這個問題其實解決方法真的是太多了,我只是講了最簡單也是最常見的幾種吧!
到此這篇關(guān)于AJAX POST數(shù)據(jù)中有特殊符號(轉(zhuǎn)義字符)導(dǎo)致數(shù)據(jù)丟失的解決方法的文章就介紹到這了,更多相關(guān)AJAX POST數(shù)據(jù)丟失內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
AJAX跨域請求獲取JSON數(shù)據(jù)的實現(xiàn)方法
我們都知道,由于受到瀏覽器的限制,AJAX?是不允許跨域請求,不過可以通過使用?JSONP?來實現(xiàn),本文介紹了?JSONP?的是怎么在?jQuery,MooTools?的,Dojo?Toolkit?中實現(xiàn)的,感興趣的朋友跟隨小編一起看看吧2023-06-06Ajax添加數(shù)據(jù)與刪除篇實現(xiàn)代碼
Hello 大家好!這個ajax系列教程講到這里已經(jīng)完成50%了.第4篇講了ajax向數(shù)據(jù)庫添加數(shù)據(jù),第5篇講了ajax修改數(shù)據(jù)庫中的數(shù)據(jù).今天我們來講ajax添加數(shù)據(jù)與刪除并存的實例效果.2010-10-10ajax中的async屬性值之同步和異步及同步和異步區(qū)別
在Jquery中ajax方法中async用于控制同步和異步,當async值為true時是異步請求,當async值為fase時是同步請求。ajax中async這個屬性,用于控制請求數(shù)據(jù)的方式,默認是true,即默認以異步的方式請求數(shù)據(jù)。2015-10-10JQuery+Ajax+Struts2+Hibernate框架整合實現(xiàn)完整的登錄注冊
最近沒有項目做,閑著沒事,看到一個書城的網(wǎng)站很好,于是就是仿了一個,把里面的ui直接拿過來用,前端后端自己寫的,目前大部分的功能已經(jīng)實現(xiàn)了。2015-10-10asp.net jquery+ajax異步刷新實現(xiàn)示例
異步刷新想必大家并不陌生吧,本文主要為大家介紹下asp.net jquery+ajax實現(xiàn)異步刷新過程,感興趣的朋友可以參考下2013-09-09