laravel如何開啟跨域功能示例詳解
前言
本文主要給大家介紹了關(guān)于laravel開啟跨域功能的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細的介紹吧。
跨域的請求
出于安全性的原因,瀏覽器會限制 Script 中的跨域請求。由于 XMLHttpRequest 遵循同源策略,所有使用 XMLHttpRequest 構(gòu)造 HTTP 請求的應(yīng)用只能訪問自己的域名,如果需要構(gòu)造跨域的請求,那么開發(fā)者需要配合瀏覽器做出一些允許跨域的配置。
W3C 應(yīng)用工作組推薦了一種跨資源共享的機制,這種機制讓 Web 應(yīng)用服務(wù)器能支持跨站訪問控制,從而使得安全的進行跨站數(shù)據(jù)傳輸成為可能,該機制通過幾種方式來對原有模式進行了擴展:
- 響應(yīng)的頭部應(yīng)該追加 Access-Control-Allow-Orign,用來表明哪些請求源被允許訪問資源內(nèi)容
- 瀏覽器會對請求源和響應(yīng)中的值進行匹配驗證
- 對于跨域的請求,瀏覽器會預(yù)發(fā)送一個非簡單方式的請求,來判斷給定資源是否準備接受跨域資源訪問
- 服務(wù)端應(yīng)用通過檢查請求頭部的 Orign 來判定請求是否跨域。
跨源資源共享標(biāo)準
跨源資源共享標(biāo)準通過新增一系列 HTTP 頭,讓服務(wù)器能聲明哪些來源可以通過瀏覽器訪問該服務(wù)器上的資源。另外,對哪些會對服務(wù)器數(shù)據(jù)造成破壞性響應(yīng)的 HTTP 請求方法(特別是 GET 以外的 HTTP 方法,或者搭配某些 MIME 類型的 POST 請求),標(biāo)準強烈要求瀏覽器必須先以 OPTIONS 請求方式發(fā)送一個預(yù)請求(preflight request),從而獲取知服務(wù)器端對跨源請求所支持 HTTP 方法。在確認服務(wù)器允許跨源請求的情況下,以實際的 HTTP 請求方法發(fā)送那個真正的請求。服務(wù)器端也可以通知客戶端,是不是需要隨同請求一起發(fā)送信用信息(包括 Cookies 和 HTTP 認證相關(guān)數(shù)據(jù))。
跨源共享標(biāo)準需要瀏覽器和服務(wù)端共同配合才能完成,目前瀏覽器廠商已經(jīng)可以將請求部分自動完成,所以跨源資源訪問的重點還是在于服務(wù)器端。
下面列出一些標(biāo)準中可用的響應(yīng)頭和請求頭。
Response Header
- Access-Control-Allow-Origin : 指明哪些請求源被允許訪問資源,值可以為 "*","null",或者單個源地址。
- Access-Control-Allow-Credentials : 指明當(dāng)請求中省略 creadentials 標(biāo)識時響應(yīng)是否暴露。對于預(yù)請求來說,它表明實際的請求中可以包含用戶憑證。
- Access-Control-Expose-Headers : 指明哪些頭信息可以安全的暴露給 CORS API 規(guī)范的 API。
- Access-Control-Max-Age : 指明預(yù)請求可以在預(yù)請求緩存中存放多久。
- Access-Control-Allow-Methods : 對于預(yù)請求來說,哪些請求方式可以用于實際的請求。
- Access-Control-Allow-Headers : 對于預(yù)請求來說,指明了哪些頭信息可以用于實際的請求中。
- Origin : 指明預(yù)請求或者跨域請求的來源。
- Access-Control-Request-Method : 對于預(yù)請求來說,指明哪些預(yù)請求中的請求方式可以被用在實際的請求中。
- Access-Control-Request-Headers : 指明預(yù)請求中的哪些頭信息可以用于實際的請求中。
Request Header
- Origin : 表明發(fā)送請求或預(yù)請求的來源。
- Access-Control-Request-Method : 在發(fā)送預(yù)請求時帶該請求頭,表明實際的請求將使用的請求方式。
- Access-Control-Request-Headers : 在發(fā)送預(yù)請求時帶有該請求頭,表明實際的請求將攜帶的請求頭。
中間件
在 Laravel 中允許跨域請求,我們可以構(gòu)建一個追加響應(yīng)的中間件,用來添加專門處理跨域的請求的響應(yīng)頭:
<?php namespace App\Http\Middleware; use Closure; use Response; class EnableCrossRequestMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $response = $next($request); $response->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; } }
其中有以下需要注意的地方:
- 對于跨域訪問并需要伴隨認證信息的請求,需要在 XMLHttpRequest 實例中指定 withCredentials 為 true。
- 這個中間件你可以根據(jù)自己的需求進行構(gòu)建,如果需要在請求中伴隨認證信息(包含 cookie,session)那么你就需要指定 Access-Control-Allow-Credentials 為 true, 因為對于預(yù)請求來說如果你未指定該響應(yīng)頭,那么瀏覽器會直接忽略該響應(yīng)。
- 在響應(yīng)中指定 Access-Control-Allow-Credentials 為 true 時,Access-Control-Allow-Origin 不能指定為 *
- 后置中間件只有在正常響應(yīng)時才會被追加響應(yīng)頭,而如果出現(xiàn)異常,這時響應(yīng)是不會經(jīng)過中間件的。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
CodeIgniter針對lighttpd服務(wù)器URL重寫的方法
這篇文章主要介紹了CodeIgniter針對lighttpd服務(wù)器URL重寫的方法,涉及l(fā)ighttpd服務(wù)器配置及URL配置規(guī)則的相關(guān)技巧,需要的朋友可以參考下2015-06-06THINKPHP3.2使用soap連接webservice的解決方法
這篇文章主要為大家詳細介紹了THINKPHP3.2使用soap連接webservice的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12Symfony學(xué)習(xí)十分鐘入門經(jīng)典教程
這篇文章主要介紹了Symfony學(xué)習(xí)十分鐘入門教程,詳細介紹了Symfony的安裝配置,項目初始化,建立Bundle,設(shè)計實體,添加約束,增刪改查等基本操作技巧,需要的朋友可以參考下2016-02-02CodeIgniter實現(xiàn)從網(wǎng)站抓取圖片并自動下載到文件夾里的方法
這篇文章主要介紹了CodeIgniter實現(xiàn)從網(wǎng)站抓取圖片并自動下載到文件夾里的方法,實例分析了CodeIgniter網(wǎng)頁圖片操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06分享PHP函數(shù)實現(xiàn)數(shù)字與文字分頁代碼
這篇文章主要介紹了PHP函數(shù)實現(xiàn)數(shù)字與文字分頁代碼,定義分頁函數(shù)_paging,在核心函數(shù)庫包裝代碼,需要的朋友可以參考下2015-07-07PHP+Mysql+jQuery文件下載次數(shù)統(tǒng)計實例講解
這篇文章主要內(nèi)容是關(guān)于PHP+Mysql+jQuery文件下載次數(shù)統(tǒng)計實例講解2015-10-10Yii實現(xiàn)Command任務(wù)處理的方法詳解
這篇文章主要介紹了Yii實現(xiàn)Command任務(wù)處理的方法,結(jié)合實例形式分析了Yii配置、加載及使用Command任務(wù)處理的步驟與相關(guān)技巧,需要的朋友可以參考下2016-07-07