面试--跨域--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.mzph.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…