首页 > 试题广场 >

简述你对HTTP控制访问(CORS)的理解。

[问答题]

简述你对HTTP控制访问(CORS)的理解。

首先要搞明白什么是同源,什么是跨域。

打一个简单的比方,你自己从你家里拿东西,不会有人说,这是同源;但是你要从隔壁的邻居的冰箱去拿可乐,你觉得可能吗,这就是跨域。

从比方中回来,事实其实没有那么简单。理解了概念后,得知道如何去判断同源还是跨域。web服务器有三要素:协议(http、https)、端口号(不过多说)、web服务器域名(比如https://github.com/mamba666
https://github.com就是域名)。三要素必须全部一致才算同源

个人认为写完上面的东东后已经理解了同源跨域已经如何区分。接下来就来看看真正的干货,不讲同源,只讲跨域(以下参考MDN)

浏览器端

如果发现有一个请求是跨域,那么浏览器会自动先拦截一下,给它的http header加上Origin字段。比如 http://localhost:8080变为Origin:http://localhost:8080。这样一来,服务器端就可以区分这个请求是不是跨域了。

服务器端

当服务器端收到浏览器端发送过来的请求后,会有一个响应header。它会告诉请求的浏览器哪儿些域名可以请求我,哪儿些方法可以执行。

响应回到浏览器端

此时浏览器会根据这个响应自动判断,然后在做决定。

服务器端返回给浏览器端的东西

  • Access-Control-Allow-Origin 允许跨域的Origin列表
  • Access-Control-Allow-Methods 允许跨域的方法列表(GET、POST等)
  • Access-Control-Allow-Headers 允许跨域的Header列表
  • Access-Control-Expose-Headers 允许暴露给JavaScript代码的Header列表
  • Access-Control-Max-Age 最大的浏览器缓存时间,单位为s

跨域请求形式

有两种,简单和非简单请求。这里说说我常遇到的 application/json 。这就是一种非简单请求,在以上所写的浏览器端之前,会先进行一次预请求,根据这个结果再去判断是否正式请求。

其实写了这么多,最重要的就是对CORS的理解,已经这个流程是怎么样的。

编辑于 2020-03-03 12:42:43 回复(2)
跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器  让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。
而CORS 允许浏览器向跨源服务器,发出跨域请求,从而克服了AJAX只能同源使用的限制。
CORS是一个W3C标准,它同时需要浏览器和服务端的支持,浏览器基本都支持,因此,想要实现CORS通信,只要服务器实现了CORS接口即可
发表于 2020-02-20 20:09:11 回复(0)
发表于 2020-11-04 16:09:29 回复(0)
XMLHttpRequest有同源限制(必须要相同的协议、域、端口才能访问)。
CORS在http中新增了一个Origin头部解决实现跨域资源共享,浏览器在发送请求时会发送这个头部,包含请求页面的源信息,服务器根据Origin头部决定是否响应。如果没有Origin头部或者信息不匹配就驳回请求;如果请求可接受服务器就会在相应的头部中设置Access-Control-Allow-Orgin头部中发回相同的源信息或者“*”表示可以被任意外域访问。
对于那些对服务器可能造成副作用的请求方法(非简单请求),还要发送预检请求告知服务器请求使用的方法和自定义的头部,服务器会在Access-Control-Allow-Headers 和Access-Control-Allow-Methods头部中返回允许请求的方法和允许的头部。此外,还可以要求携带身份认证(cookies、http认证相关数据)
发表于 2020-04-08 10:12:51 回复(0)
1、浏览器为了提高安全性使用了同源策略,才有了跨域问题。不在浏览器上进行http请求,并没有跨域限制。
2、所谓跨域,就是协议、域名、端口中有一个不一样便跨域了。
3、浏览器并没有对所有请求实行跨域限制,比如img、script。
4、CORS主要靠服务端设置CORS头部来实现。
发表于 2020-02-26 18:35:55 回复(0)
浏览器默认的安全限制为同源策略,即JavaScript或Cookie只能访问同源(相同协议,相同域名,相同端口)下的内容。但由于跨域访问资源需要,出现了CORS机制,这种机制让web服务器能跨站访问控制,使跨站数据传输更安全。
发表于 2020-02-20 14:51:21 回复(0)
客户端和服务端达成一定的协议,服务端开放访问权限给指定的客户端,允许客户端跨域访问服务端的数据。
发表于 2020-02-15 17:04:53 回复(0)