日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对CORS OPTIONS预检请求的一些思考

發布時間:2023/12/4 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对CORS OPTIONS预检请求的一些思考 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前后端分離模大勢所趨,跨域問題更是老生常談。

《程序員應對瀏覽器同源策略的姿勢》一文提到三種跨域請求方案,重點講述了w3c和瀏覽器廠商推出的CORS規范。

同源策略??所謂同源是指域名、協議、端口相同。不同源的瀏覽器腳本(javascript、ActionScript、canvas)在沒有明確授權的情況下,不能讀寫對方的資源, 這是瀏覽器最基本的安全規范。

CORS是w3c和瀏覽器廠商為解決跨域資源共享問題而推出的標準方案:

瀏覽機器一旦發現跨域請求,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求(瀏覽器自動完成,用戶不會察覺),服務器響應特定標頭Access-Control-,體現對跨源訪問的授權態度。


今天我主要想要聊一聊CORS中的預檢請求

當前端使用腳本請求一個跨域資源時,如果是非簡單請求(下文會解釋),瀏覽器會自動幫你先發出一個OPTIONS查詢請求,稱為預檢(cors-preflight-request),作用是詢問服務器當前網頁所在的域名是否在服務器的許可名單之中,以及可以使用哪些HTTP動詞和頭信息字段;只有得到肯定答復,瀏覽器才會發出正式的跨域請求。

"預檢請求“的使用,可以避免跨域請求對服務器的用戶數據產生未預期的影響。

該請求header中會包含以下兩個字段:

  • Access-Control-Request-Method: 該字段的值對應當前請求類型,例如 GET、POST、PUT等等。瀏覽器會自動處理。

  • Access-Control-Request-Headers: 該字段的值對應當前請求可能會攜帶的額外的自定義header字段名,多個字段用逗號分割。瀏覽器會自動處理,將請求中非簡單的header字段全部列出來,例如標識請求流水的x-request-id,用于Auth鑒權的Authorization 字段。

對于OPTIONS請求,按照規范實現的服務端會響應一組HTTP header,但不會返回任何實體內容。如果服務端支持該跨域請求,建議返回204狀態碼(返回200也可以);如果不支持,建議返回403狀態碼(返回404或其他錯誤狀態碼也可以)。

響應的header可以包含以下字段:

  • Access-Control-Allow-Origin: 允許哪些域被允許跨域,例如 http://qq.com 或 https://qq.com,或者設置為* ,即允許所有域訪問

  • Access-Control-Allow-Credentials: 是否攜帶票據訪問(對應fetch方法中credentials),當該值為true時,Access-Control-Allow-Origin 不允許設置為*

  • Access-Control-Allow-Methods: 標識該資源支持哪些方法,例如:POST, GET, PUT, DELETE

  • Access-Control-Allow-Headers: 標識允許哪些額外的自定義 header 字段和非簡單值的字段

  • Access-Control-Max-Age: 表示可以緩存Access-Control-Allow-Methods和Access-Control-Allow-Headers提供的信息多長時間,單位秒,由服務端和瀏覽器默認值共同決定。

  • Access-Control-Expose-Headers: 通過該字段指出哪些額外的 header 可以被支持。

由此可見,當觸發預檢時,一次AJAX請求會消耗掉兩個TTL,嚴重影響性能。

那么如何節省掉OPTIONS請求來提升性能呢?從上文可以看出,有兩個方案:

  • 發出簡單請求

  • 只要同時滿足以下兩個條件,就屬于簡單請求
    (1)使用下列方法之一:

    • head

    • get

    • post

    (2)請求的Heder是

    • Accept

    • Accept-Language

    • Content-Language

    • Content-Type: 只限于三個值:application/x-www-form-urlencoded、multipart/form-data、text/plain

    不同時滿足上面的兩個條件,就屬于非簡單請求。很明顯,我們常見的Post請求且Content-Type=application/json也屬于非簡單請求,也會觸發預檢請求。

    >? ?如果不方便改造為簡單請求,只有使用方案2了。

  • 服務器端設置Access-Control-Max-Age字段

  • 當第一次請求該URL時會發出OPTIONS請求,瀏覽器會根據返回的Access-Control-Max-Age字段緩存該OPTIONS預檢請求的響應結果。在緩存有效期內,該資源的請求(URL和header字段都相同的情況下)不會再觸發預檢。(chrome 打開控制臺可以看到,當服務器響應Access-Control-Max-Age時只有第一次請求會有預檢,后面不會了。注意要開啟緩存,去掉disable cache勾選)

    但是要注意的是,該緩存只針對這一個請求 URL 和相同的 header,無法針對整個域或者模糊匹配 URL 做緩存(當然也可以考慮封裝一下,固定一個接口地址,傳不同的body內容)。

    以上便是對CORS OPTIONS預檢請求的一些思考,希望對同學們有所幫助!

    最后是Abp vNtext配置CORS的示例:

    private?void?ConfigureCors(ServiceConfigurationContext?context,?IConfiguration?configuration) {context.Services.AddCors(options?=>{//?無阻塞跨域options.AddPolicy(DefaultCorsPolicyName,?builder?=>{builder.SetIsOriginAllowed(_?=>?true).AllowCredentials().AllowAnyHeader().WithMethods(HttpMethods.Get,?HttpMethods.Post,?HttpMethods.Put,?HttpMethods.Delete).SetPreflightMaxAge(TimeSpan.FromHours(24));});}); }

    - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age

    -??程序員應對瀏覽器同源策略的姿勢

    關注并星標我們
    更多干貨及最佳實踐分享

    總結

    以上是生活随笔為你收集整理的对CORS OPTIONS预检请求的一些思考的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。