CORS(cross-origin-resource-sharing)跨源资源共享
其实就是跨域请求。我们知道XHR只能访问同一个域中的资源,这是浏览器的安全策略所限制,但是开发中合理的跨域请求是必须的。CORS是W3的一个工作草案,基本思想就是:使用自定义的HTTP头部让浏览器与服务器沟通,决定响应成功或失败。
CORS需要浏览器和服务器同时支持,所有浏览器都支持该功能,IE浏览器在IE10以上支持。
CORS跟同源AJAX请求差别不大,主要是浏览器发现Ajax跨域请求时候,自动添加一些附加的头部信息,有时多一次附加的OPTIONS预检查请求,但用户不会感知。
(闲话:实际项目中经常遇到Access-Control-Allow-Origin报错,network里面请求数据时候会多请求一次methods为options方法的请求,它返回200后才真正再去请求一次真正的接口请求,这都是请求跨域时候的表现)
Important Part:CORS将请求分成两大类,simple request(简单请求)和not-so-simple request(非简单请求)
简单请求的请求方法是:HEAD GET POST其中之一
头部信息不超过下面几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:application/x-www-form-urlencoded,multipart/form-data,text/plain
不是简单请求的就是复杂请求了。
浏览器处理简单请求步骤:
直接发起CORS请求,在request header里面添加origin字段源Url(协议+域名+端口号),如果不在许可范围内部,服务器也是返回正常的HTTP response,但是response header里面没有包含Access-Control-Allow-Origin字段,console控制台报错,被浏览器的XHR对象的onerror回调捕获,此时的HTTP返回码可能是200。
Origin: http://www.nczonline.net
服务器认为该请求可以接受,response Header里面就会返回Access-Control-Allow-Origin返回相同的源信息地址。
Access-Control-Allow-Origin: http://www.nczonline.net
Access-Control-Allow-Credentials:true //是否允许发送Cookie
Access-Control-Expost-Headers:FooBar //获取request header里面额外的字段值
Content-Type:text/html;charset=utf-8
如果没有origin信息或者信息不匹配,那么浏览器就驳回请求,浏览器的请求和响应都不包含cookie信息。
Question:为什么CORS跨域请求和响应默认不包含cookie信息?
Answer:cookie是同源共享的,既然你都跨域了,就不能使用不同域的cookie信息了。
—————————————————————————————————————
Preflighted Requests(预检请求):
比如非简单请求:PUT,DELETE或者Content-Type是application/json类型的请求。在正式请求之前增加一次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...
上面是预检请求的HTTP requset Header参数,可以看出请求方法是OPTIONS,关键字Origin请求来自哪个源地址,Access-Control-Request-Method:请求方法,Access-Control-Request-Headers:逗号分隔的字符串,浏览器额外附加的头部信息。
服务器收到预检请求后,检查origin,Access-Control-Request-Method和Access-Control-Request-Headers字段后,确认可以跨域,就返回:
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
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/plain
Access-Control-Allow-Origin可以设为*,表示同意任意跨源请求。
__________________________________________________________________
一旦服务器通过了预检请求,以后每次的正常CORS请求,跟简单请求一样,有Origin头部信息字段,服务器的response 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
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/plain
头部信息字段。
如果是非简单请求的话,预检之后的response header里面必包含Access-Control-Allow-Origin头部信息。
————————————————————————————————————
CORS会通过预请求的透明服务器验证(透明是指封闭不可见的)机制支持开发者使用自定义头部,GET或POST之外的方法,不同类型的主体内容,预检请求发送的是OPTIONS方法,头部信息包含:
Origin
Access-Control-Request-Method
Access-Control-Request-Headers
发送请求后,OPTIONS预检请求结束,再次进行真正的Response响应请求。
跨域请求默认是不带凭证:cookie,HTTP认证和SSL证明的。但是可以通过设置:withCredentials属性为true,指定某个请求应该发送凭证,然后服务器接受请求后,Response Header里面会返回:
Access-Control-Allow-Credentials:true
各个浏览器对CORS的支持程度不同,但是都支持简单请求,可以通过检查是否存在withCredentials属性,IE的XDR跟XHR类似,实现安全可靠的跨域通信。所以可以先检测withCredentials属性,再检测XDR对象是否存在,就可以兼顾所有浏览器了。
其他跨域技术:
图像Ping:利用img标签的src属性,进行GET请求访问,不能得到服务器的返回。适合单向通信。
JSONP:利用script标签的src属性,动态生成js脚本,执行服务器返回的js脚本中的带有JSON参数的回调函数。可以通过拿到响应参数自执行回调函数,简单有用。
——————————————————————————————————————————
CORS和JSONP使用目的相同,但是比JSONP更加强大,CORS主要是服务端配置好后,浏览器根据服务端配置的自定义头部和提供的可以进行的CORS的方法来进行跨域操作
JSONP只支持GET请求,CORS支持所有类型的HTTP请求。
【完】
时光荏苒,如白驹过隙。
岁月如斯,然赤心如故。
CORS(cross-origin-resource-sharing)跨源资源共享的更多相关文章
- Node.js 【CORS(cross origin resource sharing) on ExpressJS之笔记】
app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*" ...
- CORS (Cross Origin Resources Share) 跨域
CORS 跨域 1 什么是跨域问题 基于安全考虑,浏览器会限制使用脚本发起任何跨域请求. 所谓的跨域请求,就是与当前页面的 http/ip/port 不一样的请求. 但在实际运用中,跨域获取数据的需求 ...
- spring 跨域 CORS (Cross Origin Resources Share) 跨域
Spring提供了三种方式跨域 1.CorsFilter 过滤器 2.<mvc:cors> Bean(全局,推荐使用) 3.@CrossOrigin注解 以上三种方式本质都是用来配置Cor ...
- 跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享
在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...
- 跨域的另一种解决方案CORS(CrossOrigin Resource Sharing)跨域资源共享
在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...
- (转)跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享
在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...
- 跨源资源共享(CORS)概念、实现(用Spring)、起源介绍
本文内容引用自: https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/ https://developer.m ...
- SpringBoot系列——CORS(跨源资源共享)
前言 出于安全原因,浏览器禁止ajax调用当前源之外的资源(同源策略),我们之前也有写个几种跨域的简单实现(还在问跨域?本文记录js跨域的多种实现实例),本文主要详细介绍CORS,跨源资源共享,以及如 ...
- 彻底掌握CORS跨源资源共享
本文来自于公众号链接: 彻底掌握CORS跨源资源共享 ) 本文接上篇公众号文章:彻底理解浏览器同源策略SOP 一.概述 在云时代,各种SAAS应用层出不穷,各种互联网API接口越来越丰富,H5技术在微 ...
- CORS跨源资源共享概念及配置(Kubernetes Ingress和Spring Cloud Gateway)
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 跨源资源共享CORS 跨源资源共享 (CORS) (或通俗地译为跨域资源共享)是一种基于HTTP 头的机制,该机制通过 ...
随机推荐
- Django实现注册,往邮箱发送验证链接
由于最近要做个平台,在GitHub上下载了一个系统框架,想着为了安全,实现注册时往一个邮箱发送注册信息,由管理员来确认是否同意其注册. 感谢博主:https://blog.csdn.net/geek_ ...
- shiro遇到的坑-重写sessionManager遇到的坑
最近公司开发一个微信小程序项目加shiro的项目.因为微信小程序是不使用cookie,使用的是 storage .那么我们就不能使用传统的方式来保持登录状态了. 1.首先和网上的一样,先重写一个Ses ...
- Spring的分模块开发的配置
参考:Spring学习笔记-Spring的分模块开发的配置 在加载配置文件的时候,加载多个 例如把applicationContext.xml配置文件中的关于集合配置的部分剪切到application ...
- Emgu.CV.CvInvoke的类型初始值设定项引发异常”TypeInitializationException”的问题
问题如图: 解决方案: 1.记住EmguCV的安装位置:X:\XXX\XXX… 本测试方案中EmguCV的安装位置:D:\Emgu,操作时记得用自己的EmguCV安装路径替换掉D:\Emgu. 2.添 ...
- TPO1-3 Timberline Vegetation on Mountains
Wind velocity also increase with altitude and may cause serious stress for trees,as is made evident ...
- cs231n spring 2017 lecture3 Loss Functions and Optimization
1. Loss function是用来量化评估当前预测的好坏,loss function越小表明预测越好. 几种典型的loss function: 1)Multiclass SVM loss:一般的S ...
- android高仿抖音、点餐界面、天气项目、自定义view指示、爬取美女图片等源码
Android精选源码 一个爬取美女图片的app Android高仿抖音 android一个可以上拉下滑的Ui效果 android用shape方式实现样式源码 一款Android上的新浪微博第三方轻量 ...
- [LC] 136. Single Number
Given a non-empty array of integers, every element appears twice except for one. Find that single on ...
- LeetCode Day 11
LeetCode0021 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1 ...
- 利用.swp文件恢复源文件
使用命令 vim -r filename.swp 保存即可