CORS

Posted bleachcurtain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CORS相关的知识,希望对你有一定的参考价值。

CORS

CORS是W3C标准, 全名叫跨域资源共享Cross-origin resource sharing
它允许浏览器向垮源服务器发出XMLHttpRequest请求.
CORS需要浏览器和服务器都支持
浏览器将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背后的基本思想是使用自定义的HTTP头部允许浏览器和服务器相互了解对方,从而决定请求或响应成功与否。

跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies和 HTTP 认证相关数据)。

CORS请求失败会产生错误,但是为了安全,在javascript代码层面是无法获知到底具体是哪里出了问题。你只能查看浏览器的控制台以得知具体是哪里出现了错误。

 

服务器端处理机制

服务器对于跨域请求的处理流程如下:

首先查看http头部有无origin字段;如果没有,或者不允许,当成普通请求;

如果有且是允许的,再看是否是preflight(method=OPTIONS);

如果不是preflight(简单请求),返回Allow-Origin,Allow-Credential等字段,并返回正常内容;

  如果是preflight(非简单请求),返回Allow-Headers,Allow-Methods等;

 

 

参考链接:

https://blog.csdn.net/lishanleilixin/article/details/79931298

https://blog.csdn.net/helloyongwei/article/details/80296977

以上是关于CORS的主要内容,如果未能解决你的问题,请参考以下文章

js跨域问题

springboot跨域CORS处理

JavaEE - CORS跨域

cors解决跨域

如何解决跨域问题

SSM的跨域问题解决