HTTP 的 OPTIONS 方法 用于获取目的资源所支持的通信选项

首先弄清楚一点,跨越并不是说服务器不给你返回内容。只是说服务器返回了内容,而浏览器进行拦截了。
而对于一些有副作用的请求,例如我修改了你的用户名。是不是请求一旦发起服务器就直接在数据库里面将你的名字改了呢 ?所以浏览器会在这些有副作用的请求发起之前,发送一个 options 预检请求,用来判断是否支持跨域请求,让我们的请求变得更加安全。

复杂请求

对于复杂请求,浏览器就会发送 options 预检请求。
什么是复杂请求?

  • 使用了下面任一 HTTP 方法,PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH
  • 人为设置了以下集合之外首部字段,即简单请求外的字段
  • Content-Type 的值不属于下列之一,即 application/x-www-form-urlencoded、multipart/form-data、text/plain

    options 请求优化

    当触发预检时,跨域请求便会发送 2 次请求,既增加了请求数,也延迟了请求真正发起的时间,严重影响性能。
    对 options 请求进行缓存,服务器端设置 Access-Control-Max-Age 字段,那么当第一次请求该 URL 时会发出 OPTIONS 请求,浏览器会根据返回的 Access-Control-Max-Age 字段缓存该请求的 OPTIONS 预检请求的响应结果(具体缓存时间还取决于浏览器的支持的默认最大值,取两者最小值,一般为 10 分钟)。在缓存有效期内,该资源的请求(URL 和 header 字段都相同的情况下)不会再触发预检。