首頁  >  文章  >  後端開發  >  實例解析laravel跨域功能開啟方法

實例解析laravel跨域功能開啟方法

小云云
小云云原創
2018-01-25 17:10:31998瀏覽

出於安全性的原因,瀏覽器會限制 Script 中的跨域請求。由於 XMLHttpRequest 遵循同源策略,所有使用 XMLHttpRequest 建構 HTTP 請求的應用只能存取自己的域名,如果需要建構跨域的請求,那麼開發者需要配合瀏覽器做出一些允許跨域的配置。

本文主要為大家介紹了關於laravel如何開啟跨域功能的相關資料,文中透過範例程式碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,希望能幫助大家。

W3C 應用程式工作小組推薦了一種跨資源共享的機制,這種機制讓Web 應用伺服器能支援跨站存取控制,從而使得安全的進行跨站資料傳輸成為可能,該機制透過幾種方式來對原有模式進行了擴展:

  • 回應的頭部應該追加Access-Control-Allow-Orign,用來表明哪些請求來源被允許存取資源內容

  • 瀏覽器會對請求來源和回應中的值進行匹配驗證

  • #對於跨網域的請求,瀏覽器會預先傳送一個非簡單方式的請求,來判斷給定資源是否準備接受跨域資源存取

  • 服務端應用程式透過檢查請求頭部的Orign 來判定請求是否跨域。

跨來源資源共享標準

跨來源資源共享標準透過新增一系列HTTP 頭,讓伺服器能宣告哪些來源可以透過瀏覽器存取該伺服器上的資源。另外,對哪些會對伺服器資料造成破壞性回應的HTTP 請求方法(特別是GET 以外的HTTP 方法,或搭配某些MIME 類型的POST 請求),標準強烈要求瀏覽器必須先以OPTIONS 請求方式傳送一個預請求(preflight request),從而取得知伺服器端對跨來源請求所支援HTTP 方法。在確認伺服器允許跨來源請求的情況下,以實際的 HTTP 請求方法傳送那個真正的請求。伺服器端也可以通知客戶端,是否需要隨同請求一起傳送信用資訊(包括 Cookies 和 HTTP 認證相關資料)。

跨來源共用標準需要瀏覽器和服務端共同配合才能完成,目前瀏覽器廠商已經可以將請求部分自動完成,所以跨來源資源存取的重點還是在於伺服器端。

下面列出一些標準中可用的回應頭和請求頭。

Response Header

  • Access-Control-Allow-Origin : 指明哪些請求來源被允許存取資源,值可以為"*","null",或單個來源位址。

  • Access-Control-Allow-Credentials : 指明當請求中省略 creadentials 識別時回應是否暴露。對於預先請求來說,它表明實際的請求中可以包含使用者憑證。

  • Access-Control-Expose-Headers : 指明哪些頭資訊可以安全的暴露給 CORS API 規範的 API。

  • Access-Control-Max-Age : 指明預先要求可以在預先要求快取中存放多久。

  • Access-Control-Allow-Methods : 對於預先要求來說,哪些請求方式可以用於實際的請求。

  • Access-Control-Allow-Headers : 對於預先要求來說,指明了哪些頭資訊可以用於實際的請求中。

  • Origin : 指明預先要求或跨域請求的來源。

  • Access-Control-Request-Method : 對於預先請求來說,指明哪些預請求中的請求方式可以用在實際的請求中。

  • Access-Control-Request-Headers : 指明預先要求中的哪些頭資訊可以用於實際的請求中。

Request Header

  • Origin : 表示傳送請求或預先要求的來源。

  • Access-Control-Request-Method : 在傳送預先要求時帶該請求頭,表示實際的請求將使用的請求方式。

  • Access-Control-Request-Headers : 在傳送預先要求時帶有該請求頭,表示實際的請求將攜帶的請求頭。

中間件

在Laravel 中允許跨域請求,我們可以建立一個追加回應的中間件,用來添加專門處理跨域的請求的回應頭:


<?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。

  • 這個中間件你可以根據自己的需求進行構建,如果需要在請求中伴隨認證資訊(包含cookie,session)那麼你就需要指定Access-Control-Allow-Credentials為true, 因為對於預先請求來說如果你未指定該回應頭,那麼瀏覽器會直接忽略該回應。

  • 在回應中指定Access-Control-Allow-Credentials 為true 時,Access-Control-Allow-Origin 無法指定為*

  • 後置中間件只有在正常響應時才會被追加響應頭,而如果出現異常,這時響應是不會經過中間件的。

相關推薦:

三種jQuery使用JSONP實作跨域取得資料的方法

以上是實例解析laravel跨域功能開啟方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn