持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
1.CORS
概念:跨源域资源共享(CORS)机制允许 Web 应用服务器进行跨源访问控制,从而使跨源数据传输得以安全进行。
跨源资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。
另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型 的 POST 请求),浏览器必须首先发起一个预检请求,从而获知服务端是否允许该跨源请求。
2.预检
概念:为了避免跨域请求对服务器的数据产生不可知的影响,浏览器会用 OPTIONS方法,先发送一个预检请求,待服务器确认可以访问后,再发送实际请求。
如下是一个需要执行预检请求的 HTTP 请求:
上面的代码使用 POST 请求发送一个 XML 文档,该请求包含了一个自定义的请求首部字段(X-PINGOTHER: pingpong)。另外,该请求的 Content-Type 为 application/xml。因此,该请求需要首先发起“预检请求”,可以在控制台的网络连接中查看具体连接和信息。
3.怎么用 CORS?
CORS主要工作在服务端,通过返回不同的Header来告知请求者是否可以访问,下面两个部分列出了 CORS 所有用到的 Header 及其含义。
客户端跨域请求首部字段:
1. Origin:表明预检请求或实际请求的源站。它不包含任何路径信息,只是服务器名称。
2. Access-Control-Request-Method:将实际请求所使用的 HTTP 方法告诉服务器,post、get等。
3. Access-Control-Request-Headers:首部字段用于预检请求。其作用是,将实际请求所携带的首部字段告诉服务器。
服务器响应跨域请求首部字段:
1.Access-Control-Allow-Origin:用于响应预检请求,表示允许该资源的外域 URI****
2. Access-Control-Expose-Headers:让服务器把允许浏览器访问的头放入白名单
3. Access-Control-Max-Age:指定了 preflight 请求的结果能够被缓存多久
4. Access-Control-Allow-Credentials:当跨域请求中设置了credentials=true但服务端响应中没有 Access-Control-Allow-Credentials: true,那么浏览器是不会把服务器返回的数据发回给请求者。
5. Access-Control-Allow-Methods:用于响应预检请求,指明实际请求所允许使用的 HTTP 方法
6. Access-Control-Allow-Headers:用于响应预检请求,指明实际请求中允许携带的 Header