HTTP之跨域預請求options

今天分享一個關於預請求的,咱們先寫一個接口,新建server.js,代碼:node

const http = require('http');ajax

http.createServer(function (request, response) {json

response.writeHead(200, {跨域

'Access-Control-Allow-Origin': '*'
複製代碼

});瀏覽器

response.end('welcome to options');安全

}).listen(3000);服務器

console.log('listen port 3000');app

而後node server.js,打印出listen port 300表示啓動成功,接着寫一個Ajax請求:post

$.ajax({測試

url: 'http://192.168.164.16:3000/',

method: 'get',

success: function (res) {

console.log(res);
複製代碼

}

})

'Access-Control-Allow-Origin': ''是容許跨域,固然,通常不會用,會設置某一個地址。

先明確一個概念,預請求是瀏覽器的策略機制,在真正發送請求以前,會先進行一次預請求做用是用於試探性的服務器響應是否正確,若是options得到的迴應是拒絕性質的,就會中止post、get等請求的發出,或者報錯。

在這裏插入圖片描述

會發起預請求有幾個條件:

請求方法不是GET、POST、HEAD

Content-Type不是text/plain、multipart/form-data、application/x-www-form-urlencoded

請求自定義了header字段的

上面三種狀況都會發起預請求,當咱們使用get、post、head方法發起Ajax請求的時候,用上面的接口測試,確實不會發起預請求。並且用這三個請求方法以外的都會報錯,跨域。能夠加容許跨域的方法:

'Access-Control-Allow-Methods': 'PUT'

接着Ajax發起put方法的請求,就會有兩次請求,一次是預請求options,一次是請求成功:

在這裏插入圖片描述

在這裏插入圖片描述

接着測試一下content-type,修改請求:

$.ajax({

url: 'http://192.168.164.16:3000/',

method: 'get',

contentType: 'text/plain',

success: function (res) {

console.log(res);
複製代碼

}

})

分別設置contentType爲上面的三個,發現也不會發起預請求options:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

若是換成json的:

在這裏插入圖片描述

測試這個的時候要設置請求頭:'Access-Control-Allow-Headers': '*'。

若是咱們設置另外的header:

$.ajax({

url: 'http://192.168.164.16:3000/',

method: 'get',

headers: {'X-Test': 'ok'},

success: function (res) {

console.log(res);
複製代碼

}

})

也是會發起預請求的。

在這裏插入圖片描述

最後發現,上面三種狀況以外,會發起預請求的也都會報錯跨域。還有就是,有些報跨域,可是數據仍是能獲得,只是瀏覽器認爲是不安全的,你能夠在network看見數據可是你是拿不到數據的。

在這裏插入圖片描述
相關文章
相關標籤/搜索