其实就是跨域请求。我们知道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)跨源资源共享的更多相关文章

  1. Node.js 【CORS(cross origin resource sharing) on ExpressJS之笔记】

    app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*" ...

  2. CORS (Cross Origin Resources Share) 跨域

    CORS 跨域 1 什么是跨域问题 基于安全考虑,浏览器会限制使用脚本发起任何跨域请求. 所谓的跨域请求,就是与当前页面的 http/ip/port 不一样的请求. 但在实际运用中,跨域获取数据的需求 ...

  3. spring 跨域 CORS (Cross Origin Resources Share) 跨域

    Spring提供了三种方式跨域 1.CorsFilter 过滤器 2.<mvc:cors> Bean(全局,推荐使用) 3.@CrossOrigin注解 以上三种方式本质都是用来配置Cor ...

  4. 跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享

    在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...

  5. 跨域的另一种解决方案CORS(CrossOrigin Resource Sharing)跨域资源共享

    在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...

  6. (转)跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享

    在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...

  7. 跨源资源共享(CORS)概念、实现(用Spring)、起源介绍

    本文内容引用自: https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/ https://developer.m ...

  8. SpringBoot系列——CORS(跨源资源共享)

    前言 出于安全原因,浏览器禁止ajax调用当前源之外的资源(同源策略),我们之前也有写个几种跨域的简单实现(还在问跨域?本文记录js跨域的多种实现实例),本文主要详细介绍CORS,跨源资源共享,以及如 ...

  9. 彻底掌握CORS跨源资源共享

    本文来自于公众号链接: 彻底掌握CORS跨源资源共享 ) 本文接上篇公众号文章:彻底理解浏览器同源策略SOP 一.概述 在云时代,各种SAAS应用层出不穷,各种互联网API接口越来越丰富,H5技术在微 ...

  10. CORS跨源资源共享概念及配置(Kubernetes Ingress和Spring Cloud Gateway)

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 跨源资源共享CORS 跨源资源共享 (CORS) (或通俗地译为跨域资源共享)是一种基于HTTP 头的机制,该机制通过 ...

随机推荐

  1. 查看linux系统安装的服务

    如何查看linux系统安装了哪些服务呢,因不同版本的操作系统可能使用的命令不一样或者有些命令在某些操作系统不可用,现列举一些常用查看命令(基于我的linux版本). 我的操作系统版本如下: 1.ser ...

  2. 在SpringBoot中使用Junit测试

    一:加入依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactI ...

  3. 《运筹学基础及应用》习题1.3(b)

    习题1.3(b):分别用图解法和单纯形法求解下述线性规划问题,并对照指出单纯形表中的各基可行解分别对应图解法中可行域的哪一顶点.$\max z=2x_1+x_2$,$$s.t.\begin{cases ...

  4. [LC] 674. Longest Continuous Increasing Subsequence

    Given an unsorted array of integers, find the length of longest continuous increasing subsequence (s ...

  5. jQuery ajax中的参数含义

    所有options均可选,下面简要说明每个option 1.async 默认为true,即请求为异步请求,这也是ajax存在的意义.但同时也可以将这个参数设置为false,实现同步请求.(同步请求会锁 ...

  6. Python sorted函数详解(高级篇)

    sorted() 函数对所有可迭代的对象进行排序操作. sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作. list 的 s ...

  7. MyBatis 逆向工程介绍

    1. 概念: 逆向工程就是根据数据库中对应的表在项目工程中生成相应的MyBatis代码(XXXMapper.java/XXXMapper.xml/Moudle(XXX)),逆向工程生成的代码可以进行简 ...

  8. python运算符和常用数据类型转换

    运算符 算术运算符 运算符 描述 实例 + 加 两个对象相加 a + b 输出结果 30 - 减 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 两个数相乘或是返回一个被重复若干 ...

  9. 吴裕雄--python学习笔记:sqlite3 模块

    1 sqlite3.connect(database [,timeout ,other optional arguments]) 该 API 打开一个到 SQLite 数据库文件 database 的 ...

  10. Eclipse添加comment

    1.给新增的Java类,自动生成Comment. 打开Preferences,找到Java-->Code Style -->Code Templates-->Comments--&g ...