跨域資源共享(CORS)


1、跨域資源共享(CORS) 是一種機制,它使用額外的 HTTP 頭來告訴瀏覽器,讓Web應用被准許訪問來自不同源服務器上的指定的資源
2、例如,XMLHttpRequest和Fetch API遵循同源策略。 這意味着使用這些API的Web應用程序只能從加載應用程序的同一個域請求HTTP資源,
除非響應報文包含了正確CORS響應頭
3、什么情況下需要 CORS ?
    由 XMLHttpRequest 或 Fetch 發起的跨域 HTTP 請求。
    Web 字體 (CSS 中通過 @font-face 使用跨域字體資源), 因此,網站就可以發布 TrueType 字體資源,並只允許已授權網站進行跨站調用
    WebGL 貼圖
    使用 drawImage 將 Images/video 畫面繪制到 canvas
4、跨域資源共享標准對那些可能對服務器數據產生副作用的 HTTP 請求方法(特別是 GET 以外的 HTTP 請求,或者搭配某些 MIME 類型的 POST 請求),
瀏覽器必須首先使用 OPTIONS 方法發起一個預檢請求,從而獲知服務端是否允許該跨域請求。服務器確認允許之后,
才發起實際的 HTTP 請求。在預檢請求的返回中,服務器端也可以通知客戶端,
是否需要攜帶身份憑證(包括 Cookies 和 HTTP 認證相關數據)
簡單請求
某些請求不會觸發 CORS 預檢請求,稱這樣的請求為 簡單請求
若請求滿足所有下述條件,則該請求可視為 簡單請求:
    使用下列方法之一:
        GET
        HEAD
        POST
    Fetch 規范定義了對 CORS 安全的首部字段集合,不得人為設置該集合之外的其他首部字段。該集合為:
        Accept
        Accept-Language
        Content-Language
        Content-Type (需要注意額外的限制)
        DPR
        Downlink
        Save-Data
        Viewport-Width
        Width
    Content-Type 的值僅限於下列三者之一:
        text/plain
        multipart/form-data
        application/x-www-form-urlencoded
預檢請求
要求必須首先使用 OPTIONS 方法發起一個預檢請求到服務器,預檢請求 的使用,可以避免跨域請求對服務器的用戶數據產生未預期的影響。
當請求滿足下述任一條件時,即應首先發送預檢請求:
    使用了下面任一 HTTP 方法:
        PUT
        DELETE
        CONNECT
        OPTIONS
        TRACE
        PATCH
    人為設置了對 CORS 安全的首部字段集合之外的其他首部字段。該集合為:
        Accept
        Accept-Language
        Content-Language
        Content-Type (需要注意額外的限制)
        DPR
        Downlink
        Save-Data
        Viewport-Width
        Width
     Content-Type 的值不屬於下列之一:
        application/x-www-form-urlencoded
        multipart/form-data
        text/plain
HTTP 響應首部字段
Access-Control-Allow-Origin 
    Access-Control-Allow-Origin: '*'    允許所有網站請求
    Access-Control-Allow-Origin: 'www.baidu.com'    允許百度網站請求
Access-Control-Expose-Headers
    在跨域訪問時,XMLHttpRequest對象的getResponseHeader()方法只能拿到一些最基本的響應頭,
  Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma,
  如果要訪問其他頭,則需要服務器設置本響應頭
Access-Control-Max-Age
    Access-Control-Max-Age: '1000'      1000秒內再發送請求不用在發送預請求
Access-Control-Allow-Credentials
    指定了當瀏覽器的credentials設置為true時是否允許瀏覽器讀取response的內容
Access-Control-Allow-Methods
    用於預檢請求的響應,其指明了實際請求所允許使用的 HTTP 方法
Access-Control-Allow-Headers
    用於預檢請求的響應,其指明了實際請求中允許攜帶的首部字段
HTTP 請求首部字段
    無須手動設置,當開發者使用 XMLHttpRequest 對象發起跨域請求時,它們已經被設置就緒
Origin
    表明預檢請求或實際請求的源站
Access-Control-Request-Method
    用於預檢請求,將實際請求所使用的 HTTP 方法告訴服務器
Access-Control-Request-Headers
    用於預檢請求,將實際請求所攜帶的首部字段告訴服務器

附帶身份憑證的請求

瀏覽器不會發送身份憑證信息。如果要發送憑證信息,需要設置 XMLHttpRequest 的某個特殊標志位

將 XMLHttpRequest 的 withCredentials 標志設置為 true,從而向服務器發送 Cookies。

因為這是一個簡單 GET 請求,所以瀏覽器不會對其發起 預檢請求。但是,如果服務器端的響應中未攜帶 Access-Control-Allow-Credentials: true,

瀏覽器將不會把響應內容返回給請求的發送者。


免責聲明!

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



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