美文网首页java学习
CORS 学习笔记

CORS 学习笔记

作者: 回调的幸福时光 | 来源:发表于2019-04-08 21:05 被阅读10次

前言

以前不太明白 option 请求具体是干嘛的,学习过 CORS 后才豁然开朗。
CORS 的全称是“跨域资源请求” (Cross-origin resource sharing)。

两种请求

简单请求的判断条件:同时满足以下两个条件就属于简单请求。

  1. 请求方法是 HEADGETPOST 之一;
  2. HTTP的头信息不超出以下范围:
  • Accept
  • Accept-Language
  • Content-Language
  • Last-Event-ID
  • Content-Type:application:x-www-form-urlencodedmultipart/form-datatext/plain

简单请求

简单请求不会触发 CORS 预检请求,而是直接发起 CORS 请求。

原理分析:

  1. 浏览器会直接在请求头中增加一个 Origin 字段,用来说明请求来自哪个域(协议 + 域名 + 端口);
  2. 服务器根据 Origin 字段判断是否同意此次请求。(服务器可自行通过 Access-Control-Allow-Origin设置白名单)
  3. 如果不同意此次请求,服务器返回的响应头中不包含 Access-Control-Allow-Origin,浏览器就会拦截响应,抛出异常。
  4. 如果同意请求,服务器返回的响应头中会多出 Access-Control- 相关的字段。

非简单请求

非简单请求要求必须首先使用 OPTIONS 方法发起一个预检请求到服务器,以获知服务器是否允许此次请求。

为什么需要预检请求(preflight)?

解答:CORS 出现之前,请求属于简单请求,当 CORS 规范推出以后,多了非简单请求,那么传统的没有 CORS 支持的服务器如何应对这些新增的请求呢?

  • 不支持 CORS 的服务器没有对 Access-Control-Allow-Origin、以及某些请求方法进行判断,此时如果没有预检请求,服务器将会直接收到跨域请求,如果请求方法是DELETE,那么将会对数据库中的业务数据产生影响。
  • 如果服务器支持 CORS ,此时没有预检请求,服务器端仍然会对请求给出响应,最后仅仅是浏览器拦截了响应,可此时为时已晚。

推荐阅读:
探索 CORS 中的预检请求
引入预检请求的动机
为什么跨域的post请求区分为简单请求和非简单请求和content-type相关?
浏览器预检请求(preflight request)

字段介绍

请求首部字段
  • Origin
    表明预检请求或实际请求的源站,这是浏览自己加的,不需要用户关心。

  • Access-Control-Request-Method
    用于预检请求,将实际请求用到的 HTTP 请求方法告诉服务器。

  • Access-Control-Request-Headers
    用于预检请求,将实际请求所携带的首部字段告诉服务器。

响应首部字段
  • Access-Control-Allow-Origin
    指定运行访问的该资源的白名单。

  • Access-Control-Allow-Credentials

    • 简单请求:是否允许浏览器读取响应内容
    • 预检请求:实际请求中是否可以使用凭证(credentials)
  • Access-Control-Allow-Methods
    用于预检请求,实际请求所允许使用的请求方法。比如后端可能没有运行使用 OPTIONS 请求方法,此时预检请求就会失败。

  • Access-Control-Allow-Headers
    用于预检请求,实际请求所允许携带的请求头。比如自定义 Authorization字段用于携带 token 。

  • Access-Control-Max-Age
    预检请求的结果能被缓存多久。在缓存时间内,浏览器不会对同一请求再次发起预检请求。

参考

阮一峰:CORS 通信
MDN:HTTP访问控制(CORS)

相关文章

  • CORS 学习笔记

    前言 以前不太明白 option 请求具体是干嘛的,学习过 CORS 后才豁然开朗。CORS 的全称是“跨域资源请...

  • 2019-02-20

    关于跨域总结 学习笔记 成长必要条件 -jsonp -cors 后端提供 res.setHeader('Acce...

  • HTTP学习笔记-CORS

    1. 简介 CORS(Cross Origin Resource Shared)是一种对服务端请求资源时的权限限制...

  • 2021-02-28 配置Jetty+GeoServer-2.1

    GIS学习笔记——配置GeoServer-2.18.2允许CORS跨域访问(本文仅适用于使用GeoServer默认...

  • CORS & JSONP 学习笔记一

    什么是跨域? 首先,现代浏览器为了安全,做了一个同源限制. 也就是所谓的同源安全策略. 本质上,其实是不存在所谓的...

  • HTTP访问控制(CORS)- 学习笔记

    本人博客文章地址:点击进入 今天在写一个简单的 mock-server 的时候遇到了跨域问题,导致前端页面不能正常...

  • 前端笔记:CORS

    1. 什么是CORS CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource...

  • CORS学习总结

    跨域产生原因: 浏览器同源策略。限制不同源的脚本相互访问。假设没有同源策略,将一个网站以iframe的形式嵌入到我...

  • 前端跨域解决学习

    详见https://segmentfault.com/a/1190000011145364 CORS的学习参见:h...

  • 如何处理浏览器的跨域问题

    第一种方式 CORS 首先你需要阅读CORS,首先你需要阅读CORS,首先你需要阅读CORS,重要的事情说3遍 当...

网友评论

    本文标题:CORS 学习笔记

    本文链接:https://www.haomeiwen.com/subject/lekmiqtx.html