摘要:跨域的請(qǐng)求出于安全性的原因,瀏覽器會(huì)限制中的跨域請(qǐng)求??缭垂蚕順?biāo)準(zhǔn)需要瀏覽器和服務(wù)端共同配合才能完成,目前瀏覽器廠商已經(jīng)可以將請(qǐng)求部分自動(dòng)完成,所以跨源資源訪(fǎng)問(wèn)的重點(diǎn)還是在于服務(wù)器端。指明預(yù)請(qǐng)求或者跨域請(qǐng)求的來(lái)源。
跨域的請(qǐng)求
出于安全性的原因,瀏覽器會(huì)限制 Script 中的跨域請(qǐng)求。由于 XMLHttpRequest 遵循同源策略,所有使用 XMLHttpRequest 構(gòu)造 HTTP 請(qǐng)求的應(yīng)用只能訪(fǎng)問(wèn)自己的域名,如果需要構(gòu)造跨域的請(qǐng)求,那么開(kāi)發(fā)者需要配合瀏覽器做出一些允許跨域的配置。
W3C 應(yīng)用工作組推薦了一種跨資源共享的機(jī)制,這種機(jī)制讓 Web 應(yīng)用服務(wù)器能支持跨站訪(fǎng)問(wèn)控制,從而使得安全的進(jìn)行跨站數(shù)據(jù)傳輸成為可能,該機(jī)制通過(guò)幾種方式來(lái)對(duì)原有模式進(jìn)行了擴(kuò)展:
響應(yīng)的頭部應(yīng)該追加 Access-Control-Allow-Orign,用來(lái)表明哪些請(qǐng)求源被允許訪(fǎng)問(wèn)資源內(nèi)容
瀏覽器會(huì)對(duì)請(qǐng)求源和響應(yīng)中的值進(jìn)行匹配驗(yàn)證
對(duì)于跨域的請(qǐng)求,瀏覽器會(huì)預(yù)發(fā)送一個(gè)非簡(jiǎn)單方式的請(qǐng)求,來(lái)判斷給定資源是否準(zhǔn)備接受跨域資源訪(fǎng)問(wèn)
服務(wù)端應(yīng)用通過(guò)檢查請(qǐng)求頭部的 Orign 來(lái)判定請(qǐng)求是否跨域。
跨源資源共享標(biāo)準(zhǔn)跨源資源共享標(biāo)準(zhǔn)通過(guò)新增一系列 HTTP 頭,讓服務(wù)器能聲明哪些來(lái)源可以通過(guò)瀏覽器訪(fǎng)問(wèn)該服務(wù)器上的資源。另外,對(duì)哪些會(huì)對(duì)服務(wù)器數(shù)據(jù)造成破壞性響應(yīng)的 HTTP 請(qǐng)求方法(特別是 GET 以外的 HTTP 方法,或者搭配某些 MIME 類(lèi)型的 POST 請(qǐng)求),標(biāo)準(zhǔn)強(qiáng)烈要求瀏覽器必須先以 OPTIONS 請(qǐng)求方式發(fā)送一個(gè)預(yù)請(qǐng)求(preflight request),從而獲取知服務(wù)器端對(duì)跨源請(qǐng)求所支持 HTTP 方法。在確認(rèn)服務(wù)器允許跨源請(qǐng)求的情況下,以實(shí)際的 HTTP 請(qǐng)求方法發(fā)送那個(gè)真正的請(qǐng)求。服務(wù)器端也可以通知客戶(hù)端,是不是需要隨同請(qǐng)求一起發(fā)送信用信息(包括 Cookies 和 HTTP 認(rèn)證相關(guān)數(shù)據(jù))。
跨源共享標(biāo)準(zhǔn)需要瀏覽器和服務(wù)端共同配合才能完成,目前瀏覽器廠商已經(jīng)可以將請(qǐng)求部分自動(dòng)完成,所以跨源資源訪(fǎng)問(wèn)的重點(diǎn)還是在于服務(wù)器端。
下面列出一些標(biāo)準(zhǔn)中可用的響應(yīng)頭和請(qǐng)求頭。
Response HeaderAccess-Control-Allow-Origin : 指明哪些請(qǐng)求源被允許訪(fǎng)問(wèn)資源,值可以為 "*","null",或者單個(gè)源地址。
Access-Control-Allow-Credentials : 指明當(dāng)請(qǐng)求中省略 creadentials 標(biāo)識(shí)時(shí)響應(yīng)是否暴露。對(duì)于預(yù)請(qǐng)求來(lái)說(shuō),它表明實(shí)際的請(qǐng)求中可以包含用戶(hù)憑證。
Access-Control-Expose-Headers : 指明哪些頭信息可以安全的暴露給 CORS API 規(guī)范的 API。
Access-Control-Max-Age : 指明預(yù)請(qǐng)求可以在預(yù)請(qǐng)求緩存中存放多久。
Access-Control-Allow-Methods : 對(duì)于預(yù)請(qǐng)求來(lái)說(shuō),哪些請(qǐng)求方式可以用于實(shí)際的請(qǐng)求。
Access-Control-Allow-Headers : 對(duì)于預(yù)請(qǐng)求來(lái)說(shuō),指明了哪些頭信息可以用于實(shí)際的請(qǐng)求中。
Origin : 指明預(yù)請(qǐng)求或者跨域請(qǐng)求的來(lái)源。
Access-Control-Request-Method : 對(duì)于預(yù)請(qǐng)求來(lái)說(shuō),指明哪些預(yù)請(qǐng)求中的請(qǐng)求方式可以被用在實(shí)際的請(qǐng)求中。
Access-Control-Request-Headers : 指明預(yù)請(qǐng)求中的哪些頭信息可以用于實(shí)際的請(qǐng)求中。
Request HeaderOrigin : 表明發(fā)送請(qǐng)求或預(yù)請(qǐng)求的來(lái)源。
Access-Control-Request-Method : 在發(fā)送預(yù)請(qǐng)求時(shí)帶該請(qǐng)求頭,表明實(shí)際的請(qǐng)求將使用的請(qǐng)求方式。
Access-Control-Request-Headers : 在發(fā)送預(yù)請(qǐng)求時(shí)帶有該請(qǐng)求頭,表明實(shí)際的請(qǐng)求將攜帶的請(qǐng)求頭。
中間件在 Laravel 中允許跨域請(qǐng)求,我們可以構(gòu)建一個(gè)追加響應(yīng)的中間件,用來(lái)添加專(zhuān)門(mén)處理跨域的請(qǐng)求的響應(yīng)頭:
header("Access-Control-Allow-Origin", config("app.allow")); $response->header("Access-Control-Allow-Headers", "Origin, Content-Type, Cookie, Accept"); $response->header("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, OPTIONS"); $response->header("Access-Control-Allow-Credentials", "true"); return $response; } }
其中有以下需要注意的地方:
對(duì)于跨域訪(fǎng)問(wèn)并需要伴隨認(rèn)證信息的請(qǐng)求,需要在 XMLHttpRequest 實(shí)例中指定 withCredentials 為 true。
這個(gè)中間件你可以根據(jù)自己的需求進(jìn)行構(gòu)建,如果需要在請(qǐng)求中伴隨認(rèn)證信息(包含 cookie,session)那么你就需要指定 Access-Control-Allow-Credentials 為 true, 因?yàn)閷?duì)于預(yù)請(qǐng)求來(lái)說(shuō)如果你未指定該響應(yīng)頭,那么瀏覽器會(huì)直接忽略該響應(yīng)。
在響應(yīng)中指定 Access-Control-Allow-Credentials 為 true 時(shí),Access-Control-Allow-Origin 不能指定為 *
后置中間件只有在正常響應(yīng)時(shí)才會(huì)被追加響應(yīng)頭,而如果出現(xiàn)異常,這時(shí)響應(yīng)是不會(huì)經(jīng)過(guò)中間件的。
PS: 歡迎關(guān)注簡(jiǎn)書(shū) Laravel 專(zhuān)題,也歡迎 Laravel 相關(guān)文章的投稿 :),作者知識(shí)技能水平有限,如果你有更好的設(shè)計(jì)方案歡迎討論交流,如果有錯(cuò)誤的地方也請(qǐng)批評(píng)指正,在此表示感謝謝謝 :)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/21850.html
摘要:而我的新輪子也并不是專(zhuān)門(mén)解決它的問(wèn)題的,而是順便解決而已。概述這個(gè)包,支持在所有的項(xiàng)目中使用。一旦出現(xiàn)成員,代表允許全部。列出允許跨域請(qǐng)求的方法列表,默認(rèn)是代表所有方法。信息地址嗯,新輪子,求一波。 showImg(https://segmentfault.com/img/bV5VxN?w=844&h=656); 是的,可能了解 Laravel 的都知道,在 Laravel 中簡(jiǎn)單的設(shè)...
摘要:開(kāi)啟跨域?qū)τ诳缬蛟L(fǎng)問(wèn)并需要伴隨認(rèn)證信息的請(qǐng)求,需要在實(shí)例中指定為在響應(yīng)中指定為時(shí),不能指定為自定義命令命令生成文件這里是命令行調(diào)用的名字如這里的命令行調(diào)用的時(shí)候就是這里填寫(xiě)命令行的描述當(dāng)執(zhí)行 laravel開(kāi)啟跨域 //對(duì)于跨域訪(fǎng)問(wèn)并需要伴隨認(rèn)證信息的請(qǐng)求,需要在 XMLHttpRequest 實(shí)例中指定 withCredentials 為 true,在響應(yīng)中指定 Access-Con...
摘要:上一章了解了的基礎(chǔ)理論與配置,這一章將介紹在各種不同場(chǎng)景下的不同使用方法一靜態(tài)資源服務(wù)靜態(tài)資源類(lèi)型非服務(wù)器動(dòng)態(tài)運(yùn)行生成的文件,換句話(huà)說(shuō),就是可以直接在服務(wù)器上找到對(duì)應(yīng)文件的請(qǐng)求瀏覽器端渲染圖片視頻文件,任意下載文件靜態(tài)資源服務(wù)場(chǎng)景什么是例 上一章了解了nginx的基礎(chǔ)理論與配置,這一章將介紹nginx在各種不同場(chǎng)景下的不同使用方法 一、靜態(tài)資源WEB服務(wù) 1.靜態(tài)資源類(lèi)型 非服務(wù)器動(dòng)態(tài)...
摘要:合適和夠用是最完美的追求。比如從頁(yè)面去請(qǐng)求的資源。它允許瀏覽器向跨源服務(wù)器,發(fā)出請(qǐng)求,從而克服了只能同源使用的限制。定義在中的路由都是無(wú)狀態(tài)的,并且會(huì)應(yīng)用中間件組。 關(guān)于作者 程序開(kāi)發(fā)人員,不拘泥于語(yǔ)言與技術(shù),目前主要從事PHP和前端開(kāi)發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開(kāi)發(fā)。合適和夠用是最完美的追求。 個(gè)人網(wǎng)站:http://www.linganm...
閱讀 2737·2021-09-23 11:21
閱讀 1963·2021-09-22 15:15
閱讀 1148·2021-09-10 11:27
閱讀 3515·2019-08-30 15:54
閱讀 722·2019-08-30 15:52
閱讀 1390·2019-08-30 15:44
閱讀 2416·2019-08-29 15:06
閱讀 3052·2019-08-28 18:21