面試--跨域--cors

cors是什么

cors 跨域資源共享 Cross-origin resource sharing是一種跨域的解決方案 它允許瀏覽器向跨源服務器,發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制。 但是需要瀏覽器的支持。
值得注意的是:
整個CORS通信過程,都是瀏覽器自動完成,不需要用戶參與。對于開發者來說,CORS通信(只要在服務器端設置了就行)與同源的AJAX通信沒有差別,代碼完全一樣。瀏覽器一旦發現是cors情況的AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感覺。

瀏覽器對跨域資源請求的分類

瀏覽器將cors請求分為兩類:簡單請求 非簡單請求。
簡單請求同時滿足以下兩個要求:

(1) 請求方法是以下三種方法之一:
HEAD
GET
POST
(2)HTTP的頭信息不超出以下幾種字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三個值application/x-www-form-urlencoded、multipart/form-data、text/plain

不能夠同時滿足以上兩個條件的請求就是非簡單請求。

瀏覽器發起cors簡單請求

對于簡單請求,瀏覽器直接發出CORS請求。具體來說,就是在頭信息之中,增加一個Origin字段。如下就是一個瀏覽器發簡單請求的 請求報文的頭部信息

GET /cors HTTP/1.1
Origin: http://api.bob.com
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

上面的頭信息中,Origin字段用來說明,本次請求來自哪個源(協議 + 域名 + 端口)。本實例中請求是來自 http://api.bob.com 服務器根據這個值,決定是否同意這次請求。
如果Origin指定的域名在許可范圍內,服務器返回的響應,會多出幾個頭信息字段。

Access-Control-Allow-Origin: http://api.bob.com  //必須的 請求時Origin值或者一個*
Access-Control-Allow-Credentials: true //可選的  服務器許可請求中可有Cookie,一起發給服務器。
Access-Control-Expose-Headers: FooBar  //可選的  1、
Content-Type: text/html; charset=utf-8

1、XMLHttpRequest對象的getResponseHeader()方法只能拿到6個基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必須在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader('FooBar')可以返回FooBar字段的值
瀏覽器發起簡單cors請求的時候自動發送cookie
瀏覽器發送CORS請求是默認不發送Cookie和HTTP認證信息
如果要把Cookie發到服務器,
一方面要服務器同意,指定Access-Control-Allow-Credentials字段。

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

如果在服務器返回的響應中沒有以上的字段 就說明這次跨域是不成功的。

瀏覽器發送非簡單cors請求

非簡單請求是那種對服務器有特殊要求的請求,比如請求方法是PUT或DELETE,或者Content-Type字段的類型是application/json。
下面是就是一個非簡單請求。

var url = 'http://api.alice.com/cors';
var xhr = new XMLHttpRequest();
xhr.open('PUT', url, true);
xhr.setRequestHeader('X-Custom-Header', 'value');
xhr.send();

發起非簡單請求有如下步驟

1、 預檢請求

非簡單請求的CORS請求,會在正式通信之前,增加一次HTTP查詢請求,稱為"預檢"請求(preflight)。
瀏覽器首先發送請求詢問服務器,當前網頁所在的域名是否在服務器的許可名單之中,以及可以使用哪些HTTP動詞和頭信息字段。只有得到肯定答復,瀏覽器才會發出正式的XMLHttpRequest請求,否則就報錯。
瀏覽器發送一個非簡單請求之前,就自動發出一個"預檢"請求,要求服務器確認可以這樣請求。下面是這個"預檢"請求的HTTP頭信息。

OPTIONS /cors HTTP/1.1
Origin: http://api.bob.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

"預檢"請求用的請求方法是OPTIONS,表示這個請求是用來詢問服務器支持什么請求方法的。
"預檢"請求的頭信息包括兩個特殊字段。
(1)Access-Control-Request-Method
該字段是必須的,用來列出瀏覽器的CORS請求會用到哪些HTTP方法,上例是PUT。
(2)Access-Control-Request-Headers
該字段是一個逗號分隔的字符串,指定瀏覽器CORS請求會額外發送的頭信息字段,上例是X-Custom-Header。
服務器返回的針對預檢請求的響應

HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:39 GMT
Server: Apache/2.0.61 (Unix)
Access-Control-Allow-Origin: http://api.bob.com   //表示哪個源可以跨域請求資源  origin的值或者*
Access-Control-Allow-Methods: GET, POST, PUT    //服務器支持的所有跨域請求的方法
Access-Control-Allow-Headers: X-Custom-Header   //服務器支持的所有頭信息字段
Content-Type: text/html; charset=utf-8  //可選的  服務器許可請求中可有Cookie,一起發給服務器。
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100  
Connection: Keep-Alive
Content-Type: text/plain

2、 瀏覽器的正常請求和回應

一旦服務器通過了"預檢"請求,以后每次瀏覽器正常的CORS請求,就都跟簡單請求一樣,會有一個Origin頭信息字段。服務器的回應,也都會有一個Access-Control-Allow-Origin頭信息字段。
下面是正常的cors的http請求頭部信息

PUT /cors HTTP/1.1
Origin: http://api.bob.com
Host: api.alice.com
X-Custom-Header: value
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

下面是服務器的正常響應

Access-Control-Allow-Origin: http://api.bob.com
Content-Type: text/html; charset=utf-8

cors和JSONP的比較

JSONP只支持GET請求,CORS支持所有類型的HTTP請求。JSONP的優勢在于支持老式瀏覽器,以及可以向不支持CORS的網站請求數據。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280200.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280200.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280200.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【原理圖操作】原理圖更新PCB時未改動元器件布局變動問題?

轉載PCB布局、布線完工之后,由于設計功能,發現不完善時, 原理圖部分功能需要改動,再改原理圖,修改完成后,導入PCB過程中,發現PCB中未改動(部分)的元器件 布局發生了變化,…

關閉edge任務欄預覽_如何在Microsoft Edge中關閉選項卡預覽

關閉edge任務欄預覽Now that it has extension support, Microsoft Edge is becoming a more and more viable browser. One feature people seem to either love or hate is the pop-up preview you get when you hover over a tab. There’s no built-in setting that lets y…

oracle 創建view時,授權給用戶

解決方法: 以dba用戶登錄 sqlplus / as sysdba 賦予scott用戶創建VIEW的權限 grant create view to scott 以scott用戶登錄oracle conn scott/tiger 創建視圖成功 CREATE OR REPLACE VIEW myview AS 轉載于:https://www.cnblogs.com/523823-wu/p/7635436.html

[BZOJ 1072] 排列perm

Link&#xff1a; BZOJ 1072 傳送門 Solution&#xff1a; 一道直接next_permutation純暴力就能過的題&#xff1f; 難道2007年時大家都不知道next_permutation這個函數嗎 還是用復雜度更優的狀壓DP吧 設$dp[i][j]$為狀態為$i$且對$d$余$j$的個數&#xff0c; 注意$dp[(1<&l…

智能手機丟失 數據安全_丟失智能手機時該怎么辦

智能手機丟失 數據安全Phones get stolen or lost everyday. With a plethora of data ripe for identity-theft on it, a lost phone can easily make your blood run cold. Take a deep breath, How-To Geek will talk you through this. 手機每天都會被盜或丟失。 隨著大量用…

程序員怎樣成為一名架構師?

在今天的技術圈&#xff0c;可能隨便遇到一個人遞給你一張名片&#xff0c;title 就是某某架構師。架構師多如過江之鯽&#xff0c;也正是眼下業內一個有趣的現象。對于架構師&#xff0c;你有什么看法&#xff1f;什么是架構師&#xff1f;隨便打開某招聘網站&#xff1a;系統…

C++設計模式之工廠模式(1)

關于設計模式的作用&#xff1a; “幫助我們將應用組織成容易了解&#xff0c;容易維護&#xff0c;具有彈性的架構&#xff0c;建立可維護的OO系統&#xff0c;要訣在于隨時想到系統以后可能需要的變化以及應付變化的原則。” 具體可參考&#xff1a;https://www.cnblogs.com/…

共享沒有權限訪問權限_如何與家人共享SmartThings訪問權限

共享沒有權限訪問權限If you have multiple people in your household and want them all to have access to SmartThings from their phones, here’s how to share access to SmartThings with anyone you want. 如果您的家庭中有多個人&#xff0c;并且希望他們所有人都可以…

PABX

自動用戶小交換機;&#xff3b;私用自動交換分機&#xff3d; A private telephone exchange that automatically connects internal “branch” lines to the external circuits of a telephone system. 一種自動地將內部用戶線連接到電話系統外線的專用電話交換機。 Private …

使用jquery+css實現瀑布流布局

雖然可以直接使用css實現瀑布流布局&#xff0c;但顯示的方式有點問題&#xff0c;所以這兒就直接使用jquerycss來實現瀑布流布局&#xff0c;最終效果如下&#xff1a; 思路是通過將每個小塊的position設置為relative&#xff0c;然后計算出在當前選擇的列下應該上移的距離&am…

geek_How-To Geek正在尋找安全作家

geekThink you have the perfect combination of geek knowledge and writing skills? We’re looking for an experienced, security-focused writer to join our team. 認為您將怪胎知識和寫作技能完美結合了嗎&#xff1f; 我們正在尋找經驗豐富&#xff0c;注重安全性的作…

AAC 文件解析及解碼流程

OUTLINE&#xff1a; &#xff0a; AAC概述 &#xff0a; AAC規格簡述 &#xff0a; AAC特點 &#xff0a; AAC音頻文件解析 ——ADIF&#xff06;ADTS格式 ——ADIF&#xff06;ADTS頭信息 ——ADIF&#xff06;ADTS數據信息 ——AAC文件處理流程 &#xff0a; AAC解碼流程…

JDK8之Stream新特性

/***JDK8 Stream特性* Created by chengbx on 2018/5/27.* Java 8 中的 Stream 是對集合&#xff08;Collection&#xff09;對象功能的增強&#xff0c;它專注于對集合對象進行各種非常便利、高效的聚合操作&#xff08;aggregate operation&#xff09;&#xff0c;* 或者大…

雞蛋學運維-2:Rsync同步配置步驟

說明&#xff1a;系統環境CentOS release 6.5 (Final) 2.6.32-431.el6.x86_64rsync server:配置步驟1、vi /etc/rsyncd.conf#Rsync server#created by lijianfeng 18:26 2017-9-24#rsyncd.conf start#uid rsyncgid rsyncuse chroot nomax connections 2000timeout 600pid…

IntelliJ IDEA代碼分屏顯示

轉載于:https://www.cnblogs.com/EasonJim/p/9124809.html

vscode重置應用程序_如何在Windows 10上重置應用程序的數據

vscode重置應用程序With Windows 10’s Anniversary Update, you can now reset an app’s data without actually uninstalling and reinstalling the app. This can fix problems when an app has gotten into a bad state, or just quickly restore an app to its default s…

程序報錯與提示

2019獨角獸企業重金招聘Python工程師標準>>> 我們在開發中, 為了程序的規范性,把報錯級別,調的比較高NOTICE級別的也報出來,有助于我們快速定位錯誤和代碼規范&#xff0c;但是,在產品上線后,網站運營過程中,就不宜報這么多錯. 1:這種錯誤給客戶的印象不好 2:在報錯…

【codevs1230】元素查找

problem 給出n個正整數&#xff0c;然后有m個詢問詢問該整數是否在n個正整數中出現過solution 哈希表&#xff1f; 當然是set水洛 codes #include<iostream> #include<set> using namespace std; set<int>s; int main(){int n, m;cin>>n>>m;for…

dock怎么自定義_如何自定義和調整Mac的Dock

dock怎么自定義The macOS dock normally appears at the bottom of your screen, but it doesn’t have to. The dock is customizable in quite a few ways you might not be aware of, especially if you’re a new Mac user. macOS塢站通常顯示在屏幕底部&#xff0c;但不是…

ios 輕掃手勢_輕掃即可快速刪除iOS計算器中的數字

ios 輕掃手勢iOS’ built-in calculator is a basic, simple-to-use calculator that’s very handy for doing some quick calculations, such as calculating the tip on your restaurant bill. It’s also useful for longer, more complicated calculations. However, ther…