ajax設置請求頭setRequestHeader方法,如請求數據類型等


因為平時常用的設置,所以突然被問起來會忘,一般我們ajax是直接利用jQuery的ajax方法,里面的接口直接調用,常用的主要有:

url
類型:String

默認值: 當前頁地址。發送請求的地址。

type
類型:String

默認值: "GET"。請求方式"POST"或"GET", 默認為"GET"。注意:其它HTTP請求方法,如PUT和DELETE也可以使用,但僅部分瀏覽器支持。

data
類型:String

發送到服務器的數據。將自動轉換為請求字符串格式。GET 請求中將附加在 URL 后。查看 processData 選項說明以禁止此自動轉換。

必須為 Key/Value 格式。

如果為數組,jQuery 將自動為不同值對應同一個名稱。如 {foo:["bar1", "bar2"]} 轉換為 '&foo=bar1&foo=bar2'。

既然提到processData,因為平常用它的默認值true,所以也容易被遺忘。

processData
類型:Boolean

默認值: true。默認情況下,通過data選項傳遞進來的數據,如果是一個對象(技術上講只要不是字符串),都會處理轉化成一個查詢字符串,以配合默認內容類型 "application/x-www-form-urlencoded"。如果要發送 DOM 樹信息或其它不希望轉換的信息,請設置為 false。

dataType
類型:String

是服務器返回的數據類型,有些人以為這個就是可以設置請求頭,然而它其實是設置返回數據的類型。如果不指定,jQuery 將自動根據 HTTP 包 MIME 信息來智能判斷,比如 XML MIME 類型就被識別為 XML。在 1.4 中,JSON 就會生成一個 JavaScript 對象,而 script 則會執行這個腳本。隨后服務器端返回的數據會根據這個值解析后,傳遞給回調函數。可用值:

"xml": 返回 XML 文檔,可用 jQuery 處理。

"html": 返回純文本 HTML 信息;包含的 script 標簽會在插入 dom 時執行。

"script": 返回純文本 JavaScript 代碼。不會自動緩存結果。除非設置了 "cache" 參數。注意:在遠程請求時(不在同一個域下),所有 POST 請求都將轉為 GET 請求。(因為將使用 DOM 的 script標簽來加載)

"json": 返回 JSON 數據(常用) 。

"jsonp": JSONP 格式。使用 JSONP 形式調用函數時,如 "myurl?callback=?" jQuery 將自動替換 ? 為正確的函數名,以執行回調函數。

"text": 返回純文本字符串

success
類型:Function

請求成功后的回調函數。

參數:由服務器返回,並根據 dataType 參數進行處理后的數據;描述狀態的字符串。

error
類型:Function

默認值: 自動判斷 (xml 或 html)。請求失敗時調用此函數。

有以下三個參數:XMLHttpRequest 對象、錯誤信息、(可選)捕獲的異常對象。

error: function(xhr,error,obj) {

     console.log(error);

}
如果發生了錯誤,錯誤信息(第二個參數)除了得到 null 之外,還可能是 "timeout", "error", "notmodified" 和 "parsererror"。

complete(XHR, TS)
類型:Function

請求完成后回調函數 (請求成功或失敗之后均調用)。

參數: XMLHttpRequest 對象和一個描述請求類型的字符串。

平時參數一般不寫,函數內直接寫請求完成后需要處理的事。

beforeSend(XHR)
類型:Function

發送請求前可修改 XMLHttpRequest 對象的函數,如添加自定義 HTTP 頭。

XMLHttpRequest 對象是唯一的參數。

這是一個 Ajax 事件。如果返回 false 可以取消本次 ajax 請求。

言歸正傳,設置請求頭:

XMLHttpRequest對象提供了一個設置請求頭的方法:setRequestHeader,可以在beforeSend回調里面設置請求頭:

$.ajax({

    type: "GET",

    url: "fa.php",

    success: function(data) {

        console.log(data);

    },

    beforeSend: function(xhr) {

        xhr.setRequestHeader("User-Agent", "test");

    }

});
W3C標准文檔明確規定了以下請求頭信息是瀏覽器控制,開發者不允許設置這些請求頭,設置了會提示錯誤。

Accept-Charset

Accept-Encoding

Access-Control-Request-Headers

Access-Control-Request-Method

Connection

Content-Length

Cookie

Cookie2

Date

DNT

Expect

Host

Keep-Alive

Origin

Referer

TE

Trailer

Transfer-Encoding

Upgrade

User-Agent

Via

一般我們設置的是:content-type,傳輸數據類型,即服務器需要我們傳送的數據類型

xhr.setRequestHeader ("content-type", "application/x-www-form-urlencoded" )
當然還有其他編碼方式,如:CONTENT-TYPE:multipart/form-data

PS: setRequestHeader方法只是XMLHTTP為添加或修改HTTP頭提供的一個接口方法而已, 至於里面的值則是HTTP協議的含義,當然也可以發自己的東西進去,即使IIS不能識別你的信息也不會報錯,如:

xhr.setRequestHeader("sex", "male")
雖然IIS不會報錯,但這個信息也可以有用,可以在程序里讀取HTTP頭信息分析是否有 MyName: Supermanking 信息,可根據你的需求來做處理

如將自定義的數據放入請求頭中,避免csrf攻擊

CSRF Token

CSRF的另一個特征是,攻擊者無法直接竊取到用戶的信息(Cookie,Header,網站內容等),僅僅是冒用Cookie中的信息。

而CSRF攻擊之所以能夠成功,是因為服務器誤把攻擊者發送的請求當成了用戶自己的請求。那么我們可以要求所有的用戶請求都攜帶一個CSRF攻擊者無法獲取到的Token。服務器通過校驗請求是否攜帶正確的Token,來把正常的請求和攻擊的請求區分開,也可以防范CSRF的攻擊。

beforeSend: function (xhr) {

     var token1 = $(window.document).find("meta[name=_csrf]").attr("content");

     var header1 = $(window.document).find("meta[name=_csrf_header]").attr("content");

     xhr.setRequestHeader(header1, token1);

}
參考來自:

https://www.cnblogs.com/cdwp8/p/5157377.html
https://www.cnblogs.com/Shannong/p/5300609.html
https://www.cnblogs.com/meituantech/p/9777222.html
http://www.w3school.com.cn/jquery/ajax_ajax.asp
 

歡迎關注我的公眾號,兩只摩羯程序員的日常更新~~


————————————————
版權聲明:本文為CSDN博主「yovino」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yovino/article/details/87805300


免責聲明!

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



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