2011-08-26 119 views
73

我有以下定製ajax函數將數據發佈回PHP文件。每次數據後發生了,我得到以下兩個錯誤:AJAX發佈錯誤:拒絕設置不安全標題「連接」

拒絕設定不安全頭「內容長度」
拒絕設定不安全頭「連接」

代碼:

function passposturl(url1, params, obj) 
{ 
    //url1 = url1+"&sid="+Math.random(); 
    xmlHttp = get_xmlhttp_obj(); 
    xmlHttp.loadflag = obj; 
    xmlHttp.open("POST", url1, true); 
    //alert(url1); 
    //alert(params); 
    //alert(obj); 
    //alert(params.length); 
    xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    xmlHttp.setRequestHeader("Content-length", params.length); 
    xmlHttp.setRequestHeader("Connection", "close"); 
    xmlHttp.onreadystatechange = function() 
    { 
     stateChanged(xmlHttp); 
    }; 
    xmlHttp.send(params); 
} 

我在做什麼錯?

+2

請參閱:http://stackoverflow.com/questions/2623963/webkit-refused-to-set-unsafe-header-content-length – Joe

+0

嘿喬伊。在我發佈之前,我確實經歷了這些。我仍然沒有得到它。我所要做的就是評論setRequestHeader行嗎? – sniper

回答

125

刪除以下兩行:

xmlHttp.setRequestHeader("Content-length", params.length); 
xmlHttp.setRequestHeader("Connection", "close"); 

的XMLHttpRequest不允許設置這些標頭,它們被自動地由瀏覽器設定。原因在於,通過操縱這些標頭,您可能會欺騙服務器通過相同的連接接受第二個請求,而這個連接不會經過通常的安全檢查 - 這是瀏覽器中的安全漏洞。

+4

連接:關閉導致什麼「漏洞」?如果你知道一個請求需要很長時間,它*應該*可以請求它不限制持久連接。瀏覽器不支持請求流水線操作,所以如果一個長時間運行的請求在普通請求之前出現,那麼它將阻止第二個請求完成Keepalive時間。如果長時間運行的請求可以使用「連接:關閉」,則可以請求不佔用持久連接並導致(例如)不必要的5秒延遲(其中5秒是保持活動時間)。 – doug65536

+2

@ doug65536:瀏覽器不驗證標題值,他們只是不允許設置標題,你不應該搞砸。 –

+0

嗨弗拉基米爾,如果我刪除了這兩行代碼,我如何傳遞參數? – anunixercoder