以下討論的是和瀏覽器 POST提交 后臺(tái)BUG 相關(guān)的關(guān)于使用ajax在IE瀏覽器下通過POST方式提交到后臺(tái)的一些BUG解析教程文章,內(nèi)容是本站精心挑選整理的教程,希望對(duì)廣大的網(wǎng)友給到幫助,下面是詳細(xì)內(nèi)容:
這個(gè)問題只存在客戶端是IE或IE內(nèi)核的情況,但是你無法控制客戶端使用什么瀏覽器,所以仍然會(huì)給你的應(yīng)用造成很大的性能問題。
我們先說現(xiàn)象:
服務(wù)端:我們只用一個(gè)靜態(tài)的HTML頁面ok.html,內(nèi)容只返OK.
然后我們寫一個(gè)ajax調(diào)用的html在客戶端訪問:
<script>
function send_request(method,url,param) {
http_request = false;
if (window.XMLHttpRequest) {
http_request = new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
}
}
}
if (!http_request) {
return;
}
http_request.open(method, url,true);
http_request.send(param);
}
function get(){
var url = "http://myhost/ok.html?name=axman&test=123";
for(var i=0;i<1000;i++){
send_request("GET",url,null);
}
}
function post(){
var url = "http://myhost/ok.html";
for(var i=0;i<1000;i++){
send_request("POST",url,'name=axman&test=123');
}
}
</script>
<input type="button" name="b1" value="get" onclick="get()">
<input type="button" name="b2" value="post" onclick="post()">
這個(gè)頁面上兩種方式訪問和傳遞的參數(shù)完全一致,當(dāng)我按下get按鈕后,服務(wù)端收到了1000個(gè)訪問記錄。
[admin@vm-platform access_log]$ cat apache_access.log.4 wc -l
1000
然后我統(tǒng)計(jì)訪問時(shí)間大于1ms的記錄:
[admin@vm-platform access_log]$ cat apache_access.log.4 awk '{if($12 > 1000) print $0}'
結(jié)果是空。
現(xiàn)在我們?cè)侔聪翽OST按鈕:
[admin@vm-platform access_log]$ cat apache_access.log.4 wc -l
2000
當(dāng)服務(wù)端顯示2000時(shí),說明訪問完成。
[admin@vm-platform access_log]$ cat apache_access.log.4 awk '{if($12 > 1000) print $0}'的結(jié)果: 10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 696078 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" - 10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 696045 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" - 10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 695776 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" - 10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 695332 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" - 10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 696500 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" - 10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 696484 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" - 10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 696215 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" - 10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 696235 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" - 10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 696182 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" - 10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 694964 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" - 10.16.14.82 - - - [24/Nov/2011:16:08:58 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 1274 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" - 10.16.14.82 - - - [24/Nov/2011:16:08:59 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 1019 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" - |
請(qǐng)注意apache %D記錄的時(shí)間是從第一個(gè)頭域(讀到第一個(gè)換行回車開始)記時(shí)到響應(yīng)輸出(協(xié)議層,只要寫到BUFF中,不一定已經(jīng)發(fā)送到客戶端)。這個(gè)時(shí)間單位是
微秒,請(qǐng)看一下其中有10條記錄近700ms,是get方式的千倍。
因?yàn)檫@個(gè)現(xiàn)象給我們的兩個(gè)應(yīng)用帶來性能問題,我開始分析這個(gè)原因,后來從網(wǎng)上搜索到文章說IE內(nèi)核的瀏覽器在AJAX調(diào)用時(shí),對(duì)POST方式采用兩步發(fā)送,第一次發(fā)送
頭域,第二次發(fā)送BODY。中間有很大的延遲,有時(shí)還會(huì)造成BODY包丟失,我們從網(wǎng)絡(luò)抓包的情況看,確實(shí)存在只發(fā)送了HEADER,后面只有服務(wù)端超時(shí)返回的錯(cuò)誤數(shù)據(jù)包,再也沒有BODY的數(shù)據(jù)。這樣的機(jī)率大約有1%.
這個(gè)問題在apache作為proxy時(shí),proxy就不能在有效的時(shí)間內(nèi)將客戶端請(qǐng)求發(fā)送給backend,造成大量的內(nèi)部錯(cuò)誤輸出。如果是SS還會(huì)引起數(shù)據(jù)時(shí)序混亂。在發(fā)送/r/n/r/n后頭域還有尾巴沒有發(fā)送完成,這些現(xiàn)象都是從網(wǎng)絡(luò)抓包監(jiān)控到的。
如果換成fireFox,同樣的AJAX代碼執(zhí)行POST就沒有問題,關(guān)鍵是你根本無法控制用戶不使用IE。
網(wǎng)上給出的解決方案試了一下根本不起作用(也許IE6可以起作用,我用的IE8就沒有細(xì)測(cè)IE6),關(guān)鍵是只要部分瀏覽器發(fā)生這個(gè)情況,就會(huì)給應(yīng)用帶來很大的性能問題。
所以盡量少使用AJAX的POST方式提交數(shù)據(jù),但是有時(shí)服務(wù)端為了安全的原因只允許POST提交,可以動(dòng)態(tài)構(gòu)造FORM表單,而盡量少使用AJAX來調(diào)用POST。
End. 教程到這里講完了,閱讀是否有所收獲呢?本站還提供有瀏覽器 POST提交 后臺(tái)BUG 相關(guān)的內(nèi)容,歡迎繼續(xù)閱讀。
新聞熱點(diǎn)
疑難解答
圖片精選